我有一个选择,我有3个结果:
Microsoft.AspNet
在此选择之后我有3个结果。现在我想在另一个表更新或为每个结果插入一个新行
这是我的完整代码
我在表格中没有任何更新或新插入。有人可以帮帮我吗?
$stmt = $handler->prepare("SELECT id,comments,likes,views FROM sites WHERE usr_id = '$usr_id'");
$stmt->execute();
答案 0 :(得分:1)
第一个问题,你根本没有利用准备好的陈述。使用参数(查询中的?
),然后使用execute()
调用中的值填充它们。
此外,在循环外准备查询,并在内部执行。这是提前准备报表的关键优势之一,当它们只准备一次时,开销就会减少。
最后,在查询之前不需要检查数据库,然后执行两个查询之一。让MySQL检查该值是否已经存在INSERT...ON DUPLICATE KEY UPDATE
语法。这依赖于正确设置的数据库,因此UNIQUE
上应该有(session.usr_id, session.site_id)
索引。
这是未经测试的,但应该让你去:
$stmt1 = $handler->prepare("SELECT id,comments,likes,views FROM sites WHERE usr_id = ?");
$stmt2 = $handler->prepare("INSERT INTO session SET comments = ?, likes = ?, views = ?, usr_id = ?, site_id = ? ON DUPLICATE KEY UPDATE comments = VALUES(comments), likes = VALUES(likes), views = VALUES(views)");
$stmt1->execute(array($usr_id));
while($row = $stmt1->fetch(PDO::FETCH_ASSOC)) {
$site_id = $row["id"];
$stmt2->execute(array($comments, $likes, $views, $usr_id, $site_id));
}
答案 1 :(得分:0)
@ Miken32的答案将是理想的方式。
直接修复代码就是这样:
$stmt1 = $handler->prepare("SELECT id,comments,likes,views FROM sites WHERE usr_id = :usr_id");
$stmt1->bindValue(':usr_id', $usr_id);
$stmt1->execute();
while ($row = $stmt1->fetch(PDO::FETCH_ASSOC)) {
$stmt2 = $handler->prepare("SELECT id FROM session WHERE site_id = :site_id AND usr_id = :usr_id");
$stmt2->bindValue(':usr_id', $usr_id);
$stmt2->bindValue(':site_id', $row['id']);
$stmt2->execute();
if ($stmt2->rowCount() > 0) {
$stmt3 = $handler->prepare("UPDATE session SET comments = :comments , likes = :likes , views = :views WHERE usr_id = :usr_id AND site_id = :site_id");
} else {
$stmt3 = $handler->prepare("INSERT INTO session(user_id,site_id,comments,likes,views)VALUES(:usr_id,:site_id,:comments,:likes,:views)");
}
$stmt3->bindValue(':comments', $row['comments']);
$stmt3->bindValue(':likes', $row['likes']);
$stmt3->bindValue(':views', $row['views']);
$stmt3->bindValue(':usr_id', $usr_id);
$stmt3->bindValue(':site_id', $row['id']);
$stmt3->execute();
}
但这不是最好的方法。 INSERT ...UPDATE ON DUPLICATE KEY
会更好。