我在Mysqli的预备语句中遇到了一些问题,我不知道为什么。
我有一个当前有3行的数据库,我想使用SELECT WHERE
查询来选择。在PhpMyAdmin中工作的查询是:
SELECT `totalhits`, `totalmisses`, `date` FROM `performance` WHERE `domain` = 'test' AND `profileid` = 1 ORDER BY `date` DESC
这会显示所有三行(均为domain = test
和profileid=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');
答案 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