MySQLi准备语句和提取字段
问题描述:
我有一个名为$lines
的字符串数组,我想用每个字符串搜索一个数据库。MySQLi准备语句和提取字段
我有什么的作品:
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);
答
由于使用预处理语句绕过需要报价和传递的确切变量,你需要通过通配符在你的变量,而不是在查询:
$stmt = $conn->prepare("SELECT * FROM $table WHERE `$column` LIKE ?");
$stmt->bind_param("s", '%'.$line.'%');
好的谢谢。但是,我的回声声明仍未打印 – almino
您是否没有收到任何行,或者只有这些列?如果只是这些列,请尝试'var_dump($ row);'以找出该数组中究竟是什么。 – aynber