我一直在尝试学习预处理语句,以便我们可以在PHP站点中开始实现它们。此函数使用$ _POST传输方法从搜索表单上的文本框中获取值(或无),然后使用这些文本框的名称和值向WHERE子句添加条件。该函数以前工作过,我似乎无法使准备好的语句起作用。
研究几个脚本我开始使用下面的脚本并找出一些错误。现在,当我运行它时,我收到错误错误的参数计数为mysqli_stmt :: bind_param()
运行此查询后,我想将值导出到表中,并在尝试准备语句之前正在运行。
这是我到目前为止的代码:
<?php
$db = mysqli_connec("ip_address", "loginname", "password", "database");
$refs = array('sssss');
foreach ($_POST as $key => $value)
{
$refs[] =& $_POST[$key];
}
$query = "SELECT col1, col2, col3, col4, col5 FROM tbl_name WHERE 1=1";
foreach ($_POST as $k => $v)
{
if(!empty($v)) {
$query .= " AND $k = ?";
$params[$k] = $v;
}
}
$results = $db->prepare($query);
call_user_func_array(array($results, 'bind_param'), $refs);
$results->execute();
&GT;
答案 0 :(得分:3)
传递给mysqli_stmt::bind_param
的参数必须通过引用传递,并且只能通过引用传递变量,因此在这种情况下,您无法将函数的结果直接传递给call_user_func_array
。此外,传递给bind_param
的第一个参数是变量类型的字符串列表。相反,试试这个:
// Change to whatever types are relevant
$refs = array('sss');
foreach ($arr as $key => $value)
{
$refs[] =& $arr[$key];
}
call_user_func_array(array($results, 'bind_param'), $refs);
修改强>
这一行错了:
$results = $mysqli->prepare($query);
应该是
$results = $db->prepare($query);
答案 1 :(得分:0)
好吧,我解决这个问题的方法是废弃一切并重新开始,这总是很有趣......但是我需要的新脚本就在这里
<?php
$dbhost = "ip_address";
$dbname = "db_name";
$dbuser = "db_login";
$dbpass = "db_pass";
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
$query = "SELECT * FROM tbl_name WHERE 1=1";
foreach ($_POST as $k => $v)
{
if(!empty($v)) {
$query .= " AND $k LIKE ?";
$params[] = $v;
}
}
$results = $conn->prepare($query);
$results->execute($params);
$results->bindColumn(1, $no);
$results->bindColumn(2, $date);
$results->bindColumn(3, $name);
$results->bindColumn(4, $id);
$results->bindColumn(5, $path);
?>