Prepared语句返回0个元素,手动查询返回1

时间:2014-03-03 01:35:55

标签: php mysqli prepared-statement

基本上,它就是标题所说的。我通过mysqli->查询进行查询,它可以工作。我像这样改写它,它什么也没做。

$conn = new mysqli('localhost','root','root','test');
if (!$conn) { die('Error1');}

$sql = 'SELECT * FROM test_data WHERE type = ?';

$one = 1;

$ps = $conn->prepare($sql);
$ps->bind_param('i', $one);
$ps->execute();

$out = '';

$ps->bind_result($out);
print_r($ps); 
echo out;

$ps->fetch();
print_r($ps);
echo out;

输出如下,重复两次:

mysqli_stmt Object ( [affected_rows] => -1 [insert_id] => 0 [num_rows] => 0 [param_count] => 1 [field_count] => 7 [errno] => 0 [error] => [sqlstate] => 00000 [id] => 1 )

有谁知道我可以用什么来进一步调试这个?

编辑:这是有效的代码:

$conn = new mysqli('localhost','root','root','test');
if (!$conn) { die('Error1');}

$sql = 'SELECT * FROM test_data WHERE type = 1';

$ps = $conn->query($sql);

$ps->fetch_assoc();

print_r($ps);

哪个输出:

mysqli_result Object ( [current_field] => 0 [field_count] => 7 [lengths] => Array ( [0] => 1 [1] => 10 [2] => 3 [3] => 1 [4] => 1 [5] => 1 [6] => 2 ) [num_rows] => 10 [type] => 0 )

1 个答案:

答案 0 :(得分:0)

当您使用bind_result时,您需要知道结果中将包含多少列,然后您需要为结果中的每一列提供一个变量。

我们无法知道结果集应该是什么样子,因为您使用的是SELECT * FROM test_data,但除非test_data只有一列,否则您没有传递足够的变量。

例如,如果结果集中有3列,则需要以下内容:

$ps->bind_result($out1, $out2, $out3);

从那里,你是print_r($ ps)当然是mysqli对象。我不确定你对此的期望,但没有理由试图转储该对象。

如果结果集可能有多行,则需要执行获取循环:

while ($ps->fetch()) {
    echo "$out1, $out2, $out3 <br>";
}