动态绑定参数PHP

时间:2014-09-09 14:52:29

标签: php parameterized-query

这是我第一次涉足堆栈溢出的世界,我是编程新手,可能会拼命使用一些帮助。我正在尝试动态参数化一个mysqli数据库查询,但不断收到错误说“mysqli_stmt :: bind_param()的参数计数错误”,即使我(非常)确定我的计数并不那么糟糕。在此先感谢您的帮助,相关代码如下。

$search = "SELECT Row1, Row2, Row3, Row4, Row5, Row6 FROM Listings WHERE (Search1 LIKE ?) AND (Search2 LIKE ?) AND (Search3 LIKE ?) AND (Status='Active')";

$params= array(&$param1, &$param2, &$param3);
$stmt = $con2->stmt_init();
        if($stmt->prepare($search)) {
            call_user_func_array(array($stmt, 'bind_param'), $params);

            if($stmt->execute()) {
                $stmt->bind_result($Row1, $Row2, $Row3, $Row4, $Row5, $Row6);
                echo 'Success';
          }
         }`

1 个答案:

答案 0 :(得分:3)

检查the official manual。函数/方法签名表明bind_param在您的情况下需要3个参数:

bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )

您正在传递值,但是您没有传递指示类型的字符串:

$params = array(
    'sss',
    &$param1,
    &$param2,
    &$param3
);

会更有意义。但是,就个人而言,我发现这样的代码对你实际做的事情毫无意义,只需写下来:

$stmt->bind_param('sss', $param1, $param2, $param3);
无论如何,

更有意义,而且你不需要构造那个引用数组,调用call_user_func_array,它只是调用bind_param方法开始。所以基本上:坚持单线

稍微偏离主题:
一些友好的建议:你的查询,虽然使用预备语句和所有远非完美:你似乎没有检查通配符(%_),所以如果这些参数是来自用户,请确保您最终不会执行如下所示的LIKE查询:

SELECT Row1, Row2, Row3, Row4, Row5, Row6 
FROM Listings 
WHERE Search1 LIKE '%'
  AND Search2 LIKE '%'
  AND Search3 LIKE '%'
  AND Status='Active'

只会使用Status = 'Active'返回所有记录。通过使用=代替LIKE或清理输入来解决此问题。