当等效的普通查询返回3

时间:2017-05-23 19:35:45

标签: php mysqli

我在Mysqli的预备语句中遇到了一些问题,我不知道为什么。

我有一个当前有3行的数据库,我想使用SELECT WHERE查询来选择。在PhpMyAdmin中工作的查询是:

SELECT `totalhits`, `totalmisses`, `date` FROM `performance` WHERE `domain` = 'test' AND `profileid` = 1 ORDER BY `date` DESC

这会显示所有三行(均为domain = testprofileid=1。)

如果我在Mysqli和硬编码变量中使用普通查询运行它,我会得到相同的结果:

$query = $conn->query(“SELECT `totalhits`, `totalmisses`, `date` FROM `performance` WHERE `domain` = 'test' AND `profileid` = 1 ORDER BY `date` DESC”);
echo $query->num_rows; //outputs 3

如果我尝试将其作为参数查询运行(因为我将使用用户输入的数据),我会返回0行:

$stmt = $conn->prepare("SELECT `totalhits`, `totalmisses`, `date` FROM `performance` WHERE `domain` = ? AND `profileid` = ? ORDER BY `date` DESC");
$domain = 'test';
$profileid = 1;
$stmt->bind_param('si', $domain,$profileid);
$stmt->execute();
echo $stmt->num_rows; //outputs 0

任何这些行都不会生成Mysqli错误(在每个点上使用print_r进行检查)。我还在执行行之后添加了一个$stmt->store_result()行,但仍然有相同的结果(我应该这样做吗?)。

我知道我必须在某个地方出错,但我没有阅读手册或文档中的任何内容,这些内容可能会给我一个暗示。真的很感激所有的帮助!

如果有用,SQL数据库设置为:

CREATE TABLE `performance` (
  `performanceid` int(11) NOT NULL,
  `domain` varchar(128) NOT NULL,
  `profileid` int(8) NOT NULL,
  `totalhits` int(11) NOT NULL,
  `totalmisses` int(11) NOT NULL,
  `date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `performance` (`performanceid`, `domain`, `profileid`, `totalhits`, `totalmisses`, `date`) VALUES
(1, 'test', 1, 0, 1, '2017-05-15'),
(2, 'test', 1, 1, 1, '2017-05-23'),
(3, 'test', 1, 0, 0, '2017-05-23');

1 个答案:

答案 0 :(得分:6)

mysqli_stmt::num_rows的文档遗漏了有关在准备好的陈述中使用num_rows的一些详细信息。描述相当模糊,因为它仅指在使用过程样式时存储结果的需要, object-oriented example表明您需要调用store_result()访问num_rows属性之前的方法。这意味着您的代码应该是这样的:

$stmt = $conn->prepare("SELECT `totalhits`, `totalmisses`, `date` FROM `performance` WHERE `domain` = ? AND `profileid` = ? ORDER BY `date` DESC");
$domain = 'test';
$profileid = 1;
$stmt->bind_param('si', $domain,$profileid);
$stmt->execute();
$stmt->store_result();
echo $stmt->num_rows; //should now output 3