SELECT COUNT(*)是否适用于MySQLi预处理语句?

时间:2012-12-04 23:00:21

标签: php mysqli prepared-statement

我正在研究测试页面,并且在阅读后我在查询中使用了MySQLi预处理语句,这使我的代码在SQL注入中变得安全。到目前为止,我已经成功完成了从我的数据库中检索数据的准备语句,这一切都很有效。

我现在要做的是使用SELECT COUNT(*)计算项目中的图库数量。就是这样。

不使用预准备语句,我的旧查询如下所示:

// count number of galleries per project
$conn = dbConnect('query');
$galNumb = "SELECT COUNT(*) FROM pj_galleries WHERE project = {$pjInfo['pj_id']}";
$gNumb = $conn->query($galNumb);
$row = $gNumb->fetch_row();
$galTotal = $row[0];

但是,对于我所有的阅读和搜索互联网,我都找不到正确的方法来写这个作为准备好的陈述。

2 个答案:

答案 0 :(得分:16)

是的,它应该可以正常工作。

但是,请记住,执行COUNT(primary_key)通常可以提供更好的效果。

所以你的上述查询看起来像

// first, setup your DB-connection
$mysqli = new mysqli('example.com', 'user', '********', 'database');

// Preparing the statement
$stmt = $mysqli->prepare('SELECT COUNT(*) FROM pj_galleries WHERE project = ?');

// binding the parameters
$stmt->bind_param('i', $pjInfo['pj_id']); // 'i' signals an integer

// Executing the query
if ( ! $stmt->execute()) {
    trigger_error('The query execution failed; MySQL said ('.$stmt->errno.') '.$stmt->error, E_USER_ERROR);
}

// fetching the results
$col1 = null;
$stmt->bind_result($col1); // you can bind multiple colums in one function call
while ($stmt->fetch()) { // for this query, there will only be one row, but it makes for a more complete example
    echo "counted {$col1} records\n";
}

$stmt->close(); // explicitly closing your statements is good practice

要获得更好,更完整的解释,请查看:http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php(示例应该让您加快速度)。

另请注意,如果需要,您可以多次执行预准备语句。您还可以在重新执行查询之前绑定新参数。

答案 1 :(得分:5)

你可能会过度思考问题,因为它与任何其他准备好的陈述没有什么不同:

$conn = new mysqli;
$sql = "SELECT COUNT(*) FROM pj_galleries WHERE project = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $pjInfo['pj_id']);
$stmt->execute();
$row = $stmt->get_result()->fetch_row();
$galTotal = $row[0];