我找到了一个很酷的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));{?>
任何人都可以看到我的错误吗?
答案 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;
您必须为第二个查询做类似的事情。