Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SELECT COUNT(*)是否适用于MySQLi准备的语句?_Php_Mysqli_Prepared Statement - Fatal编程技术网

Php SELECT COUNT(*)是否适用于MySQLi准备的语句?

Php SELECT COUNT(*)是否适用于MySQLi准备的语句?,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我在一个测试页面上工作,在阅读了MySQLi编写的语句后,我在查询中使用了这些语句,它们使我的代码不受SQL注入的影响。到目前为止,我已经成功地使用准备好的语句从数据库中检索数据,这一切都很好 我现在要做的是使用SELECT count(*)计算项目中的库数。就这样 在不使用预处理语句的情况下,我的旧查询如下所示: // count number of galleries per project $conn = dbConnect('query'); $galNumb = "SELECT COU

我在一个测试页面上工作,在阅读了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];

但是,尽管我在互联网上阅读和搜索了很多东西,我还是找不到合适的方法来写这篇事先准备好的声明。

是的,它应该很好用

但是,请记住,执行
计数(主键)
通常会提供更好的性能

因此,您上面的查询如下所示

// 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
为了得到更好更完整的解释,请看:(例子应该能让你了解最新情况)


还要记住,如果需要,您可以多次执行一条准备好的语句。您还可以在重新执行查询之前绑定新参数。

您可能考虑过了,因为它与任何其他准备好的语句没有什么不同:

$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];

杰科,这不是我要问的。我想知道如何将上面的代码编写成一个预先准备好的语句。谢谢你简洁而有用的回答。嗯…我用什么变量来回显结果?Jacco,我想简单地计算一个给定项目的库数,比如说项目1有3个库。我只希望查询返回数字,在本例中为3。我添加了更多的代码注释,我希望这会清除它。我建议将您的查询重写为
从pj_galleries中选择COUNT(pj_galleries_id),其中project=?
假设
pj_galleries_id
pj_galleries
表的主键。如果我理解正确,您希望统计属于某个项目的所有记录。通过计算主键,您应该得到与计数(*)相同的结果。;是
WHERE
子句告诉MySQL要计算哪些行。(试一试,实验是最好的进步方法)。我刚刚在我的页面上尝试了这一点,我得到了一个错误:致命错误:在第26行调用/path/file.php中未定义的方法mysqli::bind_param()-我错过了什么?@EP fantastic!明天我要试一试。今天这简直把我的脑袋给压碎了。谢谢你和这里的每一个人的帮助!明天会让你知道它的进展情况。@EP我不断收到错误,然后我将
($query)
更改为
($galNumb)
,并让它开始工作。我现在在摆弄它,虽然它应该给数字3,它仍然只说1。将让您知道我发现了什么。@EP-好的,在数据库中进行一些数字更改后,无论列中有哪些数字,结果都返回1。奇怪。$stmt->execute()从不返回resultset,它根据执行的方式返回true或false,如果需要count(*),则必须添加以下代码行$stmt->store_result()$stmt->bind_结果($totalRows)$stmt->fetch();您将在$totalRowsa中找到count(*)的值主持人出于某种原因删除了我的答案。您也可以选择使用标准库,而不是自己构建MySQLi,例如:Jacco…我注意到。我感谢你的帮助,你是一个非常乐于助人的人,谢谢!