Kezdőoldal » Számítástechnika » Weblapkészítés » Php prepared statement keresés?

Php prepared statement keresés?

Figyelt kérdés

Van egy inputom, amibe be lehet írni egy nevet, és ha talál rá felhasználót, akkor egymás alá kilistázza annak/azoknak adatait. Eddig az egésze adatbázis kezelés mysqli_* függvényekkel ment, de most már majdnem kész az oldal, ezért átírom az összeset prepared statement-re, így biztonságosabb is lesz. A keresés így nézne ki:

$valid = true;

$keresendo = $_GET["search"];

if(empty($keresendo)){

$valid = false;

}

if($valid){

$conn = new mysqli($host, $user, $pass, $db);

$keres_nev = $conn->prepare("SELECT * from `regist` WHERE CONCAT(`vezeteknev`,' ',`keresztnev`) LIKE ? OR CONCAT(`vezeteknev`,`keresztnev`) LIKE ?");

$keres_nev->bind_param("ss", $one, $two);

$keres_nev->execute();

$keres_nev->bind_result($field1, $field2, $field3, $field4, $field5, $field6, $field7, $field8);

$keres_nev->store_result();

$keres_eredmeny = $keres_nev->num_rows();

$keres_nev->get_result();

if($keres_eredmeny == 0){

//Listázás

while($searchdatas = $keres_nev->fetch_assoc()){

$userdatas[] = $searchdatas;

}

}

$keres_nev->close();

$conn->close();

}

Nos, a gondom az lenne, hogy nem engedi a fetch_assoc függvényt, mindig ezt kapom:

Fatal error: Call to undefined method mysqli_stmt::fetch_assoc() in....



2015. szept. 19. 10:19
 1/3 anonim ***** válasza:

"Eddig az egésze adatbázis kezelés mysqli_* függvényekkel ment, de most már majdnem kész az oldal, ezért átírom az összeset prepared statement-re"

Már itt van egy kis fogalomzavar. A kettő nem zárja ki egymást. Te a mysqli_* függvényekről álltál át a mysqli objektum orientált változatára. Ami szerintem is jobb, de a kettő a kódolás stílusán kívül nem különbözik, tehát mysqli_* függvényekkel is megoldható ugyanúgy a prepared statement.


A kódod egyébként több helyen sem egyértelmű számomra.


Használod a bind_result() metódust. Ezzel semmi gond nincs, de olvasd el a dokumentációt: [link] - ha megnézed a példakódot, itt a bind_result() után rögtön használható a fetch() metódus, ugyanúgy ciklusban, és a megadott változókban lesz az adatod.


A store_result() használata sem probléma, hiszen a dokumentáció szerint a num_rows()-hoz szükséged van rá (bufferelés miatt).


Viszont hogy ebből miért csinálsz ezután get_result()-tal result set-et, azt nem értem. Ez sem lenne rossz dolog önmagában, de akkor meg sem a bind_result(), sem a store_result()-ra nincs szükséged, és a szintaktika sem helyes. Ugyanis, elolvasva a dokumentációt: [link] - kiderül, hogy a get_result() metódus visszatérési értéke a result set, vagyis a $keres_nev objektumon nem tudsz result set metódusokat csinálni, csak a létrejött result seten. A helyes kód ez lenne:


$keres_nev->bind_param("ss", $one, $two);

$keres_nev->execute();

//idáig jó, ezután rögtön ugrás ide:

$result_keres_nev = $keres_nev->get_result();

$keres_eredmeny = $result_keres_nev->num_rows();

if($keres_eredmeny == 0){

//Listázás

while($searchdatas = $result_keres_nev->fetch_assoc()){

$userdatas[] = $searchdatas;

}

}

//innentől jó


VAGY


$keres_nev->bind_param("ss", $one, $two);

$keres_nev->execute();

$keres_nev->bind_result($field1, $field2, $field3, $field4, $field5, $field6, $field7, $field8);

$keres_nev->store_result();

$keres_eredmeny = $keres_nev->num_rows();

//idáig jó, ezután rögtön ugrás ide:

if($keres_eredmeny == 0){

//Listázás

while($keres_nev->fetch()){

$userdatas[] = array($field1, $field2, $field3, $field4, $field5, $field6, $field7, $field8);

}

}


Megjegyzendő, hogy a 2. példakódban a tömb értéke nem lesz azonos. Hiszen itt a mezőnevek elvesznek (meg sem jelennek sehol, csak magában a lekérdezésben), és egy sima sorszámozott tömb lesz az összes elem, míg az 1. esetben asszociatív tömböt kapsz, a mezőnevek lesznek az indexek minden elem esetében.

Az 1. kód egyébként nem mindig működik. PHP függő, ha a a PHP a mysqlnd-vel megy, akkor jó, de ha nem, akkor nem (mert ott nincs get_result() metódus), és ez nem tőled függ, hanem a szervertől, ahol futtatotd.


Emiatt a sok anomália miatt javasolt a mysqli helyett a PDO használata. Nem állítom, hogy a mysqli rossz lenne, én is használom, de amint látod, sokkal nagyobb odafigyelést igényel, és vannak vele gondok is.

2015. szept. 19. 11:28
Hasznos számodra ez a válasz?
 2/3 A kérdező kommentje:
Köszönöm, és ezt a mysqlnd-t hogyan tudnám beállítani?
2015. szept. 19. 21:17
 3/3 A kérdező kommentje:
Sikerült minden, köszi !! :)
2015. szept. 19. 23:22

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!