PHP / MySQL了解准备语句返回的内容

时间:2013-08-16 11:02:55

标签: php mysql mysqli

对于非常新手的问题感到抱歉 - 我是一位经验丰富的程序员,试图了解LAMP数据检索。不幸的是,我想要的是如此基本,我找不到答案!

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

$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);

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

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

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

但是,如果这似乎从我期望成为一个专栏创建一行!

抱歉 - 我知道我在PHP和VBScript中处理返回的数据之间缺少一些根本区别 - 只是等待尤里卡时刻!

提前感谢您提供任何帮助。

鲍勃

P.S。是的,我有O'Reilly Programming PHP书籍,但那里没有关于这个的详细信息!

2 个答案:

答案 0 :(得分:1)

  

准备好的声明返回的内容

这是一个很长的故事。书籍作者通常对此没有任何想法。

你真正需要知道的是,mysqli预处理语句并不打算在应用程序代码中使用,而只是作为更高级抽象库的源材料。

所以,如果你不打算写一个,只是退出使用mysqli,但移动PDO。它具有更直观的FAR和所有熟悉的方法来获得结果。

$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循环中。

答案 1 :(得分:-1)

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

while ($row = $result->fetch_assoc()) {
      echo $row['first_name']; // or whatever your column is called
}