【问题标题】:SQL insert and delete logic adviceSQL 插入和删除逻辑建议
【发布时间】:2020-12-07 00:27:36
【问题描述】:

在表单发布时,需要删除某些行或需要将新行插入数据库(mysql)。

我有什么:

$toInsert = array() // array of ID's where new rows need to be created because these ID's dont exist in any row.
$toDelete = array() // array of ID's where rows containing this ID need to be deleted.

删除sql查询:

$sql = DELETE FROM table WHERE id IN ' . implode(',',$toDelete);

查询会删除所有包含此 ID 的行。我怎么能做同样的事情,但插入?某些默认值需要与 ID 本身一起插入。

非常感谢您的建议或批评。

【问题讨论】:

  • 是的,您可以进行单次插入查询stackoverflow.com/questions/6889065/…,只需事先准备好。是的,您可以使用 WHERE id IN (id1, id2, ...) 发出单个删除查询
  • 非常感谢,我一直在找这样的帖子,但找不到。
  • 友情提醒,在为用户输入创建 SQL 查询时要小心,如果 $toDelete 受到应用程序输入的任何影响,因为它现在可能被用于恶意 SQL 注入。 w3schools.com/sql/sql_injection.asp

标签: php mysql insert sql-delete


【解决方案1】:

请记住,您必须对 id 进行转义(或确保转换为整数)。正确的语法是:

$q_delete_ids = implode(', ', array_map('intval', $toDelete));
$sql = " DELETE FROM table WHERE id IN ($q_delete_ids) ";

应该在引用任何值的地方开发一个通用函数,并与 array_map 一起使用。

例如带有具有 escape() 方法的虚构 db 对象的代码(如 addlashes() 但对 db 引擎更安全,并避免随机排序规则问题...)

public function quoteSurround($val) {
    return "'" . $this-db->escape($val) . "'";
}

现在,对于插入,应该开发一种通用方法,例如在哪里传递一个包含所有 db 列的数组(如果你错过了一些列,请确保你在 mysql 表 DDL 中有默认值)。

本质上你应该开发一个函数来创建和执行一个类似的 sql 字符串

INSERT INTO table (col1, col2, col3) VALUES (1, 'test1', '2000-01-01'), (2, 'test2', '2000-02-02'), (3, 'test3', '2000-03-03'), (4, 'test4', '2000-04-04'), (5, 'test5', '2000-05-05'); 

我希望我能在接下来的几天里在 github 上发布一个 gist...

【讨论】:

  • 感谢您的回答,我确保我的 sql 查询现在使用您的建议更加安全。
猜你喜欢
  • 2015-10-28
  • 1970-01-01
  • 2014-05-25
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多