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;

您必须对第二个查询执行类似的操作。