PDO 语法错误
PDO Syntax Bugs
我找到了一个很酷的 AJAX 教程,它有一个问题:它的 MySQL 查询没有更新到 PDO。
所以我正在尝试修复三个错误:mysql_insert_id()、mysql_num_rows()、mysql_fetch_array()。我用谷歌搜索了所有三个的修复程序,但显然我至少搞砸了一个。我无法准确判断问题出在哪里。
这是原代码...
mysql_query("INSERT INTO users (id, user_name,score,category_id)VALUES ('NULL','$name',0,'$category')") or die(mysql_error());
$_SESSION['name']= $name;
$_SESSION['id'] = mysql_insert_id();
和...
$res = mysql_query("select * from questions where category_id='$category' ORDER BY RAND()") or die(mysql_error());
$rows = mysql_num_rows($res);
$i=1;
while($result=mysql_fetch_array($res)){?>
这是我的改头换面:
$stm = $pdo->prepare("INSERT INTO users (id, user_name,score,category_id)VALUES ('NULL','$name',0,'$category')");
$stm->execute(array(
));
$_SESSION['name']= $name;
$_SESSION['id'] = lastInsertId;
和...
$res = $pdo->prepare("select * from questions where category_id='$category' ORDER BY RAND()");
$res->execute(array(
));
$num_rows = $res->fetchColumn();
$i=1;
$row = $res->fetch(PDO::FETCH_ASSOC));{?>
谁能看出我的错误?
$stm = $pdo->prepare("INSERT INTO users (id, user_name, score, category_id)VALUES(NULL, :name, 0, :category)");
$params = array(":name" => $_SESSION['name']= $name, ":category" => $_SESSION['id'] = lastInsertId);
$stm->execute($params);
这应该可以解决第一个 PDO 查询的问题。我就拿它当例子教给大家。
PDO 准备声明。这意味着查询实际上是由数据库驱动程序而不是 PHP 构建的。因此,在查询中传递 PHP 参数不是可行的方法。需要通过 execute 语句将参数添加到函数中。
在您的 SQL
中,您可以使用 :variable
引用这些参数。注意冒号 :
。每个变量只能使用一次!将参数作为数组提供给函数执行,其中 :variable
是数组 key
并与要发送到数据库的 value
组合。
你应该使用参数:
$stm = $pdo->prepare("INSERT INTO users (id, user_name,score,category_id) VALUES (NULL,:name ,0,:category)");
$stm->execute(array(
':name' => $name,
':category' => $category
));
LastInsertId 是 PDO
的道具
$_SESSION['name']= $name;
$_SESSION['id'] = $pdo->lastInsertId;
再次使用参数:
$res = $pdo->prepare("select * from questions where category_id=:category ORDER BY RAND()");
$res->execute(array(
':category' => $category
));
您可以使用PDOStatement::rowCount
获取行数:
$num_rows = $res->rowCount();
最后获取结果:
while(false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC))) {
// do stuff
}
或在 html 输出上下文中:
<?php while(false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC))): ?>
<!-- html and php output code here -->
<?php endwhile; ?>
您遇到的 SQL 错误是因为您没有正确编写查询。
让我们首先构建 SQL 字符串。请注意,变量已替换为冒号 (:
) 和字母数字标识符。
$sql = "INSERT INTO users (id, user_name, score, category_id) VALUES ('NULL', :name, 0, :category)"
然后准备:
$stm = $pdo->prepare($sql);
然后执行。您将一个值数组传递给它,键入参数名称:
$stm->execute(array(
':name' => $name,
':category' => $category,
));
最后,您可以将您使用的值放入会话数组中:
$_SESSION['name']= $name;
$_SESSION['id'] = $pdo->lastInsertId;
您必须对第二个查询执行类似的操作。
我找到了一个很酷的 AJAX 教程,它有一个问题:它的 MySQL 查询没有更新到 PDO。
所以我正在尝试修复三个错误:mysql_insert_id()、mysql_num_rows()、mysql_fetch_array()。我用谷歌搜索了所有三个的修复程序,但显然我至少搞砸了一个。我无法准确判断问题出在哪里。
这是原代码...
mysql_query("INSERT INTO users (id, user_name,score,category_id)VALUES ('NULL','$name',0,'$category')") or die(mysql_error());
$_SESSION['name']= $name;
$_SESSION['id'] = mysql_insert_id();
和...
$res = mysql_query("select * from questions where category_id='$category' ORDER BY RAND()") or die(mysql_error());
$rows = mysql_num_rows($res);
$i=1;
while($result=mysql_fetch_array($res)){?>
这是我的改头换面:
$stm = $pdo->prepare("INSERT INTO users (id, user_name,score,category_id)VALUES ('NULL','$name',0,'$category')");
$stm->execute(array(
));
$_SESSION['name']= $name;
$_SESSION['id'] = lastInsertId;
和...
$res = $pdo->prepare("select * from questions where category_id='$category' ORDER BY RAND()");
$res->execute(array(
));
$num_rows = $res->fetchColumn();
$i=1;
$row = $res->fetch(PDO::FETCH_ASSOC));{?>
谁能看出我的错误?
$stm = $pdo->prepare("INSERT INTO users (id, user_name, score, category_id)VALUES(NULL, :name, 0, :category)");
$params = array(":name" => $_SESSION['name']= $name, ":category" => $_SESSION['id'] = lastInsertId);
$stm->execute($params);
这应该可以解决第一个 PDO 查询的问题。我就拿它当例子教给大家。
PDO 准备声明。这意味着查询实际上是由数据库驱动程序而不是 PHP 构建的。因此,在查询中传递 PHP 参数不是可行的方法。需要通过 execute 语句将参数添加到函数中。
在您的 SQL
中,您可以使用 :variable
引用这些参数。注意冒号 :
。每个变量只能使用一次!将参数作为数组提供给函数执行,其中 :variable
是数组 key
并与要发送到数据库的 value
组合。
你应该使用参数:
$stm = $pdo->prepare("INSERT INTO users (id, user_name,score,category_id) VALUES (NULL,:name ,0,:category)");
$stm->execute(array(
':name' => $name,
':category' => $category
));
LastInsertId 是 PDO
$_SESSION['name']= $name;
$_SESSION['id'] = $pdo->lastInsertId;
再次使用参数:
$res = $pdo->prepare("select * from questions where category_id=:category ORDER BY RAND()");
$res->execute(array(
':category' => $category
));
您可以使用PDOStatement::rowCount
获取行数:
$num_rows = $res->rowCount();
最后获取结果:
while(false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC))) {
// do stuff
}
或在 html 输出上下文中:
<?php while(false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC))): ?>
<!-- html and php output code here -->
<?php endwhile; ?>
您遇到的 SQL 错误是因为您没有正确编写查询。
让我们首先构建 SQL 字符串。请注意,变量已替换为冒号 (:
) 和字母数字标识符。
$sql = "INSERT INTO users (id, user_name, score, category_id) VALUES ('NULL', :name, 0, :category)"
然后准备:
$stm = $pdo->prepare($sql);
然后执行。您将一个值数组传递给它,键入参数名称:
$stm->execute(array(
':name' => $name,
':category' => $category,
));
最后,您可以将您使用的值放入会话数组中:
$_SESSION['name']= $name;
$_SESSION['id'] = $pdo->lastInsertId;
您必须对第二个查询执行类似的操作。