我正在尝试为用户输入编写准备好的语句。参数数量根据用户输入而变化。 Oam 正在尝试此代码
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']; } } }
当我 print_r($inputArray)
时,输出为:
Array ( [0] => ss [1] => my [2] => name )
错误日志中没有显示错误。
出了什么问题?
P粉8264299072024-03-26 14:50:12
编写一个通用查询处理程序并向其传递您的查询、参数数组和参数类型列表。返回一组结果或消息。这是我自己的 mysqli 个人版本(我主要使用 PDO,但也为此设置了类似的功能)。对插入、更新和删除执行相同的操作。然后只需维护您的一个库并将其用于您所做的所有事情:) 请注意,如果您以此开始,您可能希望更好地处理连接错误等。
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
%
环绕参数,而不是占位符。
我的代码片段将使用面向对象的 mysqli 语法,而不是您的代码演示的过程语法。
首先您需要设置必要的成分:
我将把 #2 和 #3 组合成一个变量,以便使用 splat 运算符(...
)进行更简单的“解包”。数据类型字符串必须是第一个元素,然后一个或多个元素将代表绑定值。
作为逻辑包含,如果 WHERE 子句中没有条件,则使用准备好的语句没有任何好处;直接查询表即可。
代码:(PHPize.online 演示)
$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"; }
对于任何寻找类似动态查询技术的人: