INSERT后设置其他行的状态

时间:2009-01-28 03:22:13

标签: php sql

嘿,我有一个名为STATUS的字段,显示为1或隐藏0。我的代码如下。我正在使用jQuery编辑就地编辑器。每次更新它都会创建一个我想要的新ROW,但是我只希望新的一个有STATUS = 1而其他的都是0.我有什么想法会怎么做?

<?php
    include "../../inc/config.inc.php";
    $temp  = explode("_", $_REQUEST['element_id'] );
    $field = $temp[0];
    $id    = $temp[1];
    $textboxval = stripslashes(mysql_real_escape_string(preg_replace('/[\$]/',"",$_REQUEST["update_value"])));      
    $query      = "INSERT INTO notes ($field,status,date,c_id) VALUES ('$textboxval','1',NOW(),'$id')";
    mysql_query($query);
    echo($_REQUEST['update_value']);
?>

3 个答案:

答案 0 :(得分:2)

我不确定你究竟是什么意思 - 你想要除了新的条目以外的所有条目都是status = 0吗?如果是这样,只需在插入之前发布更新:

UPDATE notes SET status = 0

但是,我还应该注意到你有一个潜在的SQL注入需要担心。通过在应用“mysql真实转义字符串”之后删除斜杠,您可能允许某人在您的SQL语句中放置将执行任意SQL语句的文本。

答案 1 :(得分:0)

这样的事情,对不起以前的帖子,我第一次读错了然后回去了:

<?php
    include "../../inc/config.inc.php";
    $temp  = explode("_", $_REQUEST['element_id'] );
    $field = $temp[0];
    $id    = $temp[1];
    $textboxval = mysql_real_escape_stringstripslashes((preg_replace('/[\$]/',"",$_REQUEST["update_value"]))); 
    // set older entries to 0 - to not show but show in history
    $hide_notes      = "UPDATE notes SET status = 0";
    mysql_query($hide_notes);

    // add new entry with status of 1 to show only latest note
    $query      = "INSERT INTO notes ($field,status,date,c_id) VALUES ('$textboxval','1',NOW(),'$id')";
    mysql_query($query);
    echo($_REQUEST['update_value']);
?>

我刚刚遇到一个问题,我没有设置我的桌子不允许我一次显示多个客户端,我将拥有众多客户,我的计划哈哈

答案 2 :(得分:0)

您真的想要获取新生成的行的ID,然后触发UPDATE,其中ID为的所有行不是新行,例如

UPDATE notes SET status = 0 WHERE id != $newly_generated_id

如果表中的ID列使用AUTO_INCREMENT,您可以通过“SELECT LAST_INSERT_ID()”获取其ID,然后在UPDATE语句中使用该语句中的返回值。

伪代码:

$insert = mysql_query("INSERT INTO ..."); 
$last_id = mysql_query("SELECT LAST_INSERT_ID()"); 
$update = mysql_quqery("UPDATE notes SET status = 0 WHERE id != $last_id");

这种方法的唯一警告是你可能有一个短暂的时刻,其中2行有status = 1(你的INSERT和UPDATE之间的时间)。我会在事务中包含所有这些,以使整个单元更具原子性。