准备好的语句不获取数据
Posted
技术标签:
【中文标题】准备好的语句不获取数据【英文标题】:Prepared statement doesn't fetches data 【发布时间】:2017-09-01 14:38:28 【问题描述】:$id = $_REQUEST['id'];
$stmt = $conn->prepare('SELECT * FROM test WHERE id = ?');
echo $id;
$stmt->bind_param('s', $id);
$stmt->execute();
// This is line 12
while ($row = $stmt->fetch())
$test = $row['test'];
好的,我们开始吧。这段代码不起作用,因为我基本上收到一个错误,告诉我关注
#0 /example/example.php(2): require()
#1 main
thrown in /example/example.inc.php on line 12
我不知道我做错了什么,但我已经尝试过bind_result()
和$stmt->fetch_assoc()
,它们也不起作用。我在这里阅读了很多其他问题,但它们对我没有帮助。
这是连接
<?
$servername = "exase";
$username = "exaus";
$password = "exapw";
$dbname = "exa_db";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error)
die("Connection failed: " . $conn->connect_error);
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error)
die("Connection failed: " . $conn->connect_error);
【问题讨论】:
你的连接是什么样的? 实际的错误信息是什么? (该堆栈跟踪上方的行) 您应该将参数绑定为 int,而不是字符串。$stmt->bind_param('i', $id);
不确定这是否能解决您的问题,但您目前做得不好。
Jay waot O cam ad 连接,但我还有其他几个脚本,一切正常
GrumpyCrouton 你回答了我关于 switch 语句的最后一个问题:D 不,id 不是一个数字,它只包含字母
【参考方案1】:
使用 MySQLi 准备好的语句时,它与使用标准查询略有不同。您需要使用mysqli_stmt::bind_result()
,或使用mysqli_stmt::get_result()
存储结果集,然后才能在获取结果时使用数据。请注意,在使用 get_result()
之前,您需要 MySQL 原生驱动程序 mysqlnd
- 否则您需要使用 bind_result()
手动绑定每一列。
这是一个如何使用bind_result()
的示例。请注意,您需要绑定与查询中一样多的列,并且由于您执行SELECT *
,因此您需要绑定表中的所有内容 - 但是,如果您这样做,该方法将失败稍后在您的表格中添加一列。因此最好只选择您需要的列,例如SELECT id, test FROM..
。
$id = $_REQUEST['id'];
$stmt = $conn->prepare('SELECT test, id FROM test WHERE id = ?');
$stmt->bind_param('s', $id);
$stmt->execute();
$stmt->bind_result($test, $result_id);
$stmt->fetch());
/*
* If there was any matching rows, the variables defined in bind_param()
* now hold the values
* You can then use '$test' and '$result_id'
*/
echo $test;
$stmt->close();
如果您安装了 MySQL 原生驱动程序,则可以使用 get_result()
并将其用作“常规”查询。那么,如果您选择SELECT *
,那么这并不重要(尽管我不建议您选择所有内容 - 您应该选择您需要的列,仅此而已)。
$id = $_REQUEST['id'];
$stmt = $conn->prepare('SELECT * FROM test WHERE id = ?');
$stmt->bind_param('s', $id);
$stmt->execute();
$result = $stmt->get_result(); // $result is now an object of MySQLi resource, and not MySQLi statement
// It can now be used as as the result-set of a regular query
$row = $result->fetch_assoc());
$test = $row['test'];
echo $test;
$stmt->close();
PHP.net on mysqli_stmt::get_result()
PHP.net on mysqli_stmt::bind_result()
【讨论】:
我不明白的一件事是,如果已经在 bind_result 中得到结果,为什么我还要花一些时间,或者不是这样吗? 因为这只会绑定每次调用fetch()
的结果(如果您有多行)。在您获取它之前,它们不包含该值。如果您只有一行与该 ID 匹配,则可以删除 while
,但您仍需要在 bind_result()
中定义的变量保存数据库中的任何值之前将其 fetch()
。
id 列有一个主键,所以它是唯一的,但是我怎样才能获取它呢?
如果它是唯一的,您可以删除while
,但您仍然需要先获取才能使用变量。
但我的意思是如何获取它们?我应该将变量放入 fetch 吗?比如 $stmt->fetch($test1, $test2);【参考方案2】:
你没有正确地做准备好的陈述,看这个:
$id = $_REQUEST['id'];
$stmt = $conn->prepare('SELECT col1,col2,col3 FROM test WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($col1,$col2,$col3); // you need to bind the result when using prepared statements
$stmt->store_result(); // store it so if the number of rows retrieved is large they won't be dropped during loop or cause the overload error
while ($stmt->fetch())
$test = $col1;
echo $col2;
$stmt->close();
【讨论】:
我需要所有列 选择*有什么问题? 相关***.com/questions/321299/… ***.com/questions/487578/… ***.com/questions/262450/… - 谢谢@clearshot66 我不知道这个:) 我猜你可以,但这不是典型的,你仍然需要 bind_result,你在使用 $stmt->fetch 时不要使用 $row 关联数组以上是关于准备好的语句不获取数据的主要内容,如果未能解决你的问题,请参考以下文章
无法使用准备好的对象语句从 mysql 获取多行数据 [重复]
如何在for循环中执行准备好的语句以从jsp中的表中获取数据?