我正在构建一个简单的登录脚本并具有以下内容:
$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/