使用wpdb->Query()函数是一种好的做法吗?

时间:2020-12-09 作者:Asmat Ali

我使用自定义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);
这是一种良好的做法吗wpdb->query() 通过将我的查询传递给函数,而不是使用专用函数,如insert()delete() 等如果没有,这种方法的缺点是什么?

2 个回复
最合适的回答,由SO网友:kero 整理而成

如果你仔细看看来源,你会发现$wpdb->insert() 将使用->query() under the hood. 所以应该是一样的,对吧?

没那么简单。它不仅仅使用->query() 而且->prepare(), 这被认为是最佳实践。同时,在代码示例中,您可能刚刚开始接受SQL注入。

这里的要点是:如果是一个简单的操作->insert() 等等。方法工作-使用它们。它们经过测试,风险很小。编写自己的查询总是有可能遇到SQL注入之类的问题。

SO网友:Tom J Nowell

使用wpdb是否是一种良好的做法->;每次都通过将查询传递给函数而不是使用专用函数(如insert()和delete()等)来执行query()函数?

No, it is not good practice. 总是喜欢insert/update/etc方法。

通常,在WordPress中使用原始SQL是一种代码味道,而在助手函数可用时使用原始SQL也是一种不好的做法。这意味着作者不知道更方便的API具有更好的速度/安全性,并迫使您重新设计WP开发人员多年来遇到的所有修复和bug。

因此:

使用insert etc插入,而不是query, 始终希望使用更具体的功能出于安全原因,使用指定格式的第三个参数query 在特定函数不可用的情况下,作为更一般的SQL查询的后备方法,请始终使用prepare 对于原始SQL,您问题中的示例存在SQL注入攻击漏洞。See here for how to prepare and secure a raw query. insert 如果您传递第三个参数,etc将自动执行此操作\', 使用$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
}

创建表怎么样

Use dbDelta, 如果表不存在,它将创建表;如果模式发生更改,它将更新模式。没有要测试表是否存在、更新或创建的查询,dbDelta 为你做这件事。它将表创建查询作为参数,必须以特定的方式格式化,否则将无法工作。

wpdb->query 不适合创建表。

仅因为使用了自定义表,就需要对自定义表进行注释,这并不意味着它更快/更好。确保使用反映要运行的查询类型的键和索引设计表。一个构建良好的表可能会有闪电般的速度,但由于糟糕的设计,大多数表在规模上的性能会比自定义的post类型差。

如果可能的话,避免编写SQL与表交互。

相关推荐

定制器绑定jQuery创建的控件

我尝试了WestonRuter发布的几个插件,用于jQuery为WP定制器创建控件。它们可以工作,但与通过PHP创建的不同。例如,使用PHP创建的控件(customizer.php) 正常响应代码输入customize-controls.js 或在中customize-previews.js:api( \'tzkmx_test_control\', function( value ){ value.bind( function( to ) { var answer