我正在使用自定义php代码来执行数据插入、删除、更新和其他任务。我可以用两种不同的方式将数据插入到一个表中,
$wpdb->insert($table_name, array('id' => NULL, 'name' => '$name', 'email' => '$email', 'city' => '$city'));
和
$sql = "INSERT INTO $table_name VALUES('', '$name', '$email', '$city')";
$wpdb->query($sql);
通过将我的查询传递给函数,而不是使用专用的函数(如insert()
和delete()
等),每次使用D3
函数是一种好做法吗?如果没有,这种方法的缺点是什么?
发布于 2020-12-09 06:03:18
如果您稍微查看一下源代码,您将看到$wpdb->insert()
将使用->query()
在引擎盖下面。所以应该是一样的对吧?
没那么简单。它不仅使用->query()
,而且使用->prepare()
,这被认为是最佳实践。同时,使用您的代码示例,您可能已经打开了SQL注入的大门。
这里的教训:如果是一个简单的操作和->insert()
等方法工作-使用他们。它们经过测试,风险很小。编写自己的查询总是有可能让自己陷入诸如SQL注入之类的麻烦。
发布于 2020-12-09 06:02:09
如果每次使用wpdb-> query ()函数,将我的查询传递给函数,而不是使用insert()和delete()等专用函数,这是一种好做法吗?
No,这不是很好的实践。总是喜欢insert
/update
/etc方法。
通常,在WordPress中使用原始SQL是一种代码嗅探,当助手函数可用时使用原始SQL也是不好的做法。这意味着作者不知道更方便的API具有更好的速度/安全性,并迫使您重新发明多年来开发人员所遇到的所有修复和bug。
所以:
insert
等插入,而不是query
,总是更喜欢更具体的函数query
作为更一般SQL查询的后盾,prepare
与原始SQL,在您的问题中的例子有SQL注入攻击错误。有关如何准备和保护原始查询,请参见此处。。如果您传递第三个参数,insert
等将自动执行此操作。'
中包装变量,使用$name
而不是'$name'
,否则会插入$name
而不是它的值。id
设置为null
,如果表是用自动增量创建的,则可以删除$result = $wpdb->insert(
$table_name,
[
'name' => $name,
'email' => $email,
'city' => $city,
],
[
'%s',
'%s',
'%s',
]
);
if ( false === $result ) {
// something went wrong
}
使用 dbDelta
** ,**如果表不存在,它将创建表,并在更改时更新它们的模式。没有查询来测试表是否存在,或者更新它,或者创建它,dbDelta
为您做它。它将表创建查询作为参数,必须以一种特定的方式进行格式化,否则将无法工作。
wpdb->query
不适合创建表。
的注记
仅仅因为您使用了自定义表,并不意味着它更快/更好。确保使用反映将要运行的查询类型的键和索引来设计表。一个良好的表可以闪电般的快速,但大多数表将表现更差的定制职位类型的规模,因为糟糕的设计。
在可能的情况下,尽量避免编写SQL来与表进行交互。
https://wordpress.stackexchange.com/questions/379560
复制