对于非常新手的问题感到抱歉 - 我是一位经验丰富的程序员,试图了解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书籍,但那里没有关于这个的详细信息!
答案 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
}