PHP/MySQL 了解准备好的语句返回什么

标签 php mysqli

我正在构建一个简单的登录脚本并具有以下内容:

$sparklyUsername = strtolower($_POST['sparklyUsername']);
$sparklyPassword = $_POST['sparklyPassword'];

if($stmt = $sparklyDatabaseConnection -> prepare("SELECT username FROM SYS_users WHERE username=?")) {
    
$stmt -> bind_param("s", $sparklyUsername); 
$stmt -> execute(); /* Execute the query */
$stmt -> bind_result($result);
$stmt -> fetch();

现在一切正常,但是如果我尝试检索多个列怎么办,例如:

if($stmt = $sparklyDatabaseConnection -> prepare("SELECT username, password, email FROM SYS_users WHERE username=?")) {
     

我收到错误“绑定(bind)变量的数量与准备好的语句中的字段数量不匹配”。

现在我习惯了 VBScript,其中这样的查询会返回一个记录集(例如 resultsRS("")),然后您可以使用列名进行查询(例如 resultsRS("username") )) 来获取特定的列,但从我能收集到的信息来看,使用上面的代码,我将每列返回到一个变量,如下所示:

$stmt -> bind_result($username, $password, $email);

如果是这种情况,我如何检查现在行是否已返回?在 VBScript 中,我将检查记录集是否为空(例如 IF resultsRS.EOF)。

如果我需要循环遍历所有返回的记录,我见过的所有示例都会显示如下内容:

while ($row = $result->fetch_assoc()) {

但是,如果这似乎从我期望的列中创建了一行!

最佳答案

What is Returned by Prepared Statement

说来话长。而书籍作者通常对此一无所知。

您真正需要了解的是,mysqli 准备好的语句并不打算按原样在应用程序代码中使用,而只是作为更高级别抽象库的源 Material 。

所以,如果你不打算写一个,就退出使用 mysqli,而是转向 PDO 。它具有更直观的 API 和所有熟悉的获取结果的方法。

$sql  = "SELECT username, password, email FROM SYS_users WHERE username=?";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($_POST['sparklyUsername']));
$row  = $stmt->fetch();

它确实会创建一行,您可以像 $row['username']

这样,无论请求多少个字段,您都将获得数据。您也可以将 fetch() 放入 while 循环中。

关于PHP/MySQL 了解准备好的语句返回什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18271827/

相关文章:

Php -MySQL 查询失败 - 错误 fatal error : Uncaught Error: Call to a member function fetch_assoc() on boolean

php - 动态绑定(bind)mysqli_stmt参数再绑定(bind)结果

php - mysqli - php - 返回多个表的所有结果

php - 类 mysqli_result 的对象无法转换为 int

php - 使用 MySQLi 和 PHP 将行分配给变量

php - 如何使用google api通过ip地址获取国家名称

php - json_decode() 返回空白但它是有效的 json

javascript - 单击按钮时如何在另一个页面上显示按钮名称

php - 根据开始时间格式化事件

php - 在不同条件下对同一数据库进行多选择