选择 * 从 MySQLi

2022-08-30 17:57:59

我的网站相当广泛,我最近刚刚切换到PHP5(称我为晚熟者)。

我之前的所有MySQL查询都是这样构建的:

"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";

这使得它变得非常容易,简单和友好。

出于明显的安全原因,我现在正在尝试切换到mysqli,并且我很难弄清楚如何在需要特定参数时实现相同的查询。SELECT * FROMbind_param

这种说法是过去的事情吗?

如果是,我如何处理涉及大量列的查询?我真的需要每次都把它们都打出来吗?


答案 1

我可能是错的,但对于你的问题,我感觉这不是真正的问题所在。您始终需要定义一些条件,无论是直接在查询字符串本身中,用于设置占位符。这并不是一个真正的问题。bind_param()bind_param()?

我使用MySQLi查询遇到的问题是部分。这就是它变得有趣的地方。我从Jeffrey Way那里看到了这篇文章:http://jeff-way.com/2009/05/27/tricky-prepared-statements/(此链接不再活跃)。该脚本基本上循环访问结果并将其作为数组返回 - 无需知道有多少列,您仍然可以使用预准备语句。SELECT *bind_result()

在这种情况下,它看起来像这样:

$stmt = $mysqli->prepare(
  'SELECT * FROM tablename WHERE field1 = ? AND field2 = ?');
$stmt->bind_param('ss', $value, $value2);
$stmt->execute();

然后使用网站上的代码段:

$meta = $stmt->result_metadata();

while ($field = $meta->fetch_field()) {
  $parameters[] = &$row[$field->name];
}

call_user_func_array(array($stmt, 'bind_result'), $parameters);

while ($stmt->fetch()) {
  foreach($row as $key => $val) {
    $x[$key] = $val;
  }
  $results[] = $x;
}

现在包含 来自 的所有信息。到目前为止,我发现这是一个理想的解决方案。$resultsSELECT *


答案 2
"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";

成为

"SELECT * FROM tablename WHERE field1 = ? && field2 = ?";

它被传递给 :$mysqli::prepare

$stmt = $mysqli->prepare(
  "SELECT * FROM tablename WHERE field1 = ? && field2 = ?");
$stmt->bind_param( "ss", $value, $value2); 
// "ss' is a format string, each "s" means string
$stmt->execute();
 
$stmt->bind_result($col1, $col2);
// then fetch and close the statement

OP评论:

所以如果我有5个参数,我可能会有“sssis”或其他东西(取决于输入的类型?

右图,预准备语句中的每个参数一个类型说明符,所有类型说明符都是位置性的(第一个说明符适用于第一个,它被第一个实际参数替换(这是第二个参数))。??bind_param


推荐