Php prepared statement keresé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....
"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.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!