0

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

$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=?")) {
     

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

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

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

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

如果我需要遍历所有返回的记录,我看到的所有示例都显示如下:

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

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

4

2 回答 2

2

Prepared Statement返回什么

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

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

所以,如果你不打算写一个,就退出使用 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 循环中。

于 2013-08-16T11:30:44.920 回答
-2

在while循环中,您将需要具有列名的行,例如

while ($row = $result->fetch_assoc()) {
      echo $row['first_name']; // or whatever your column is called
}
于 2013-08-16T11:05:10.753 回答