在mysql选择foreach之后更新行

时间:2016-01-20 22:22:57

标签: php mysql select foreach

我有一个选择,我有3个结果:

Microsoft.AspNet

在此选择之后我有3个结果。现在我想在另一个表更新或为每个结果插入一个新行

这是我的完整代码

我在表格中没有任何更新或新插入。有人可以帮帮我吗?

$stmt = $handler->prepare("SELECT id,comments,likes,views FROM sites WHERE usr_id = '$usr_id'");
$stmt->execute();

2 个答案:

答案 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会更好。