PDO语法错误

时间:2015-01-02 01:39:19

标签: php mysql pdo

我找到了一个很酷的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));{?>

任何人都可以看到我的错误吗?

3 个答案:

答案 0 :(得分:1)

$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语句将params添加到函数中。

SQL内,您可以使用:variable来引用这些参数。注意冒号:。您只能使用每个变量一次!将params作为数组提供给函数execute :variable是数组key,并与要发送到数据库的value结合使用。

答案 1 :(得分:1)

您应该使用参数:

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

再次使用params:

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

答案 2 :(得分:1)

您获得的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;

您必须为第二个查询做类似的事情。