【问题标题】:MySQLi Prepared statements and fetching fieldsMySQLi 准备好的语句和获取字段
【发布时间】:2017-08-16 16:18:54
【问题描述】:

我有一个名为 $lines 的字符串数组,我想用每个字符串搜索数据库。

我有什么工作:

foreach($lines as $line) {
    $line = real_escape_string($line);
    $sql = "select * from $table where $column like '%$line%'"
    $result = $conn->query($sql);
    if($result->num_rows) {
        while ($row = $result->fetch_assoc())
            //Name and Date are are only 2 out of 15+ column names from the db table
            echo "<tr><td> {$row['Name']} </td>
                  <td>     {$row['Date']} </td></tr>"; 
    }

但是,我不想要这个。我想使用准备好的语句并能够使用上面的列名。我试过的:(来自here

$vars = array();
$data = array();
$stmt = $conn->prepare("SELECT * FROM $table WHERE `$column` LIKE '%?%'");
$stmt->bind_param("s", $line);
$stmt->execute();
$result = $stmt->store_result();
$meta = $result->result_metadata();

echo "WORKS"; //doesn't print
while ($field = $meta->fetch_field())
    $vars[] = &$data[$field->name];
call_user_func_array(array($result, 'bind_result'), $vars);
$i = 0;
while ($result->fetch())  {
    $array[$i] = array();
        foreach ($data as $k=>$v)
            $array[$i][$k] = $v;
        $i++;
}
print_r($array);

【问题讨论】:

    标签: php mysqli prepared-statement


    【解决方案1】:

    由于使用准备好的语句绕过了对引号的需要并传入确切的变量,因此您需要在变量中传递通配符,而不是在查询中:

    $stmt = $conn->prepare("SELECT * FROM $table WHERE `$column` LIKE ?");
    $stmt->bind_param("s", '%'.$line.'%');
    

    【讨论】:

    • 好的,谢谢。但是我的回声语句仍然没有被打印出来
    • 你没有得到任何行,还是只有那些列?如果只是这些列,请尝试 var_dump($row); 找出该数组中的确切内容。
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 2012-12-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多