Rumah > Soal Jawab > teks badan
Saya cuba menulis kenyataan yang disediakan untuk input pengguna. Bilangan parameter berubah berdasarkan input pengguna. Oam sedang mencuba kod ini
Kod PHP:
$string = "my name"; $search_exploded = explode( " ", $string ); $num = count( $search_exploded ); $cart = array(); for ( $i = 1; $i <= $num; $i ++ ) { $cart[] = 's'; } $str = implode( '', $cart ); $inputArray[] = &$str; $j = count( $search_exploded ); for ( $i = 0; $i < $j; $i ++ ) { $inputArray[] = &$search_exploded[ $i ]; } print_r( $inputArray ); foreach ( $search_exploded as $search_each ) { $x ++; if ( $x == 1 ) { $construct .= "name LIKE %?%"; } else { $construct .= " or name LIKE %?%"; } } $query = "SELECT * FROM info WHERE $construct"; $stmt = mysqli_prepare( $conn, $query ); call_user_func_array( array( $stmt, 'bind_param' ), $inputArray ); if ( mysqli_stmt_execute( $stmt ) ) { $result = mysqli_stmt_get_result( $stmt ); if ( mysqli_num_rows( $result ) > 0 ) { echo $foundnum = mysqli_num_rows( $result ); while( $row = mysqli_fetch_array( $result, MYSQLI_ASSOC ) ) { echo $id = $row['id']; echo $name = $row['name']; } } }
Apabila saya print_r($inputArray)
keluarannya ialah:
Array ( [0] => ss [1] => my [2] => name )
Tiada ralat ditunjukkan dalam log ralat.
Apa yang berlaku?
P粉8264299072024-03-26 14:50:12
Tulis pengendali pertanyaan generik dan hantar pertanyaan anda, tatasusunan parameter dan senarai jenis parameter. Mengembalikan set hasil atau mesej. Ini adalah versi mysqli peribadi saya sendiri (saya kebanyakannya menggunakan PDO, tetapi mempunyai fungsi yang sama disediakan untuk ini). Lakukan perkara yang sama untuk sisipan, kemas kini dan pemadaman. Kemudian hanya kekalkan satu pustaka anda dan gunakannya untuk semua yang anda lakukan :) Ambil perhatian bahawa jika anda bermula dengan ini, anda mungkin mahu menangani ralat sambungan dsb. dengan lebih baik.
connect_error) { return false; } return $con; } // generic select function. // takes a query string, an array of parameters, and a string of // parameter types // returns an array - // if $retVal[0] is true, query was successful and returned data // and $revVal[1...N] contain the results as an associative array // if $retVal[0] is false, then $retVal[1] either contains the // message "no records returned" OR it contains a mysql error message function selectFromDB($query,$params,$paramtypes){ // intitial return; $retVal[0]=false; // establish connection $con = getDBConnection(); if(!$con){ die("db connection error"); exit; } // sets up a prepared statement $stmnt=$con->prepare($query); $stmnt->bind_param($paramtypes, ...$params); $stmnt->execute(); // get our results $result=$stmnt->get_result()->fetch_all(MYSQLI_ASSOC); if(!$result){ $retVal[1]="No records returned"; }else{ $retVal[0]=true; for($i=0;$iclose(); return $retVal; } $myusername=$_POST['username']; $mypassword=$_POST['password']; // our query, using ? as positional placeholders for our parameters $q="SELECT useridnum,username FROM users WHERE username=? and password=?"; // our parameters as an array - $p=array($myusername,$mypassword); // what data types are our params? both strings in this case $ps="ss"; // run query and get results $result=selectFromDB($q,$p,$ps); // no matching record OR a query error if(!$result[0]){ if($result[1]=="no records returned"){ // no records // do stuff }else{ // query error die($result[1]); exit; } }else{ // we have matches! for($i=1;$i $val){ print("key:".$key." -> value:".$val); } } } ?>
P粉7878060242024-03-26 12:36:45
%
Parameter sekeliling, bukan ruang letak.
Coretan kod saya akan menggunakan sintaks mysqli berorientasikan objek, bukannya sintaks prosedur yang ditunjukkan oleh kod anda.
Mula-mula anda perlu menyediakan bahan-bahan yang diperlukan:
Saya akan menggabungkan #2 dan #3 menjadi pembolehubah untuk "membongkar" lebih mudah menggunakan operator percikan (...
). Rentetan jenis data mestilah elemen pertama, kemudian satu atau lebih elemen akan mewakili nilai terikat.
Sebagai kemasukan logik, jika tiada syarat dalam klausa WHERE, tidak ada faedah dalam menggunakan pernyataan yang disediakan hanya menanyakan jadual secara langsung.
Kod: (PHPize.demo dalam talian)
$string = "Bill N_d Dave"; $conditions = []; $parameters = ['']; foreach (array_unique(explode(' ', $string)) as $value) { $conditions[] = "name LIKE ?"; $parameters[0] .= 's'; // $value = addcslashes($value, '%_'); // if you want to make wildcards from input string literal. https://stackoverflow.com/questions/18527659/how-can-i-with-mysqli-make-a-query-with-like-and-get-all-results#comment132930420_36593020 $parameters[] = "%{$value}%"; } // $parameters now holds ['sss', '%Bill%', '%N_d%', '%Dave%'] $query = "SELECT * FROM info"; if ($conditions) { $stmt = $mysqli->prepare($query . ' WHERE ' . implode(' OR ', $conditions)); $stmt->bind_param(...$parameters); $stmt->execute(); $result = $stmt->get_result(); } else { $result = $conn->query($query); } foreach ($result as $row) { echo "{$row['name']}\n"; }
Untuk sesiapa yang mencari teknik pertanyaan dinamik yang serupa: