插入/更新并避免SQL注入


insert/update and also avoiding sql injection

我想

在更新/插入之前检查数据库中是否存在某些内容。这是一个合二为一但相似的问题。

我就是这样做的。

$p->main .= '<td><input type="text" name="value"  id="value"  size="12" maxlength="50" />';
    $statement = $conn->prepare("SELECT year, month, name table_test WHERE MLOV_year= :Year 
                 AND month= month AND name= :name");
                $bind = array(
                                'year' => $year,
                                'month'   = > $month,
                'name' = > $name
                );

                $statement->tyu_exec_sql_bind($conn,$statement, $bind );
                 if ( false === $statement->fetch()) {
                               // I will run an insert statement here.
                }

    $p->main .= '</td>';
    $p->main .= '</tr>';

问题这是我第一次尝试这种方式,我想知道这是否正确?如果这是安全性?

根据数据库的不同,您可以使用 MERGE ,它正是这样做的,如果记录不存在,则插入记录,如果存在,则以原子方式更新它。

这适用于您自己进行的任何检查,因为这使其成为一个两步过程。理论上,其他人可能会在您的支票和插入之间插入记录,从而使您的插入失败。


使用预准备语句来防止 SQL 注入。你在第一段代码中做到了这一点,为什么不在第二段代码中做到了呢?

还有一个提示,当你的变量包含更新语句时,不要称它为"delete",这会让下一个阅读此内容的人感到困惑。

首先,您需要检查数据库中是否存在该值,这意味着您需要查询它,然后做出更新或删除的决定。

您还可以在表中设置唯一键约束,以防止插入重复值。