$wpdb-preparate:我必须将参数绑定到表名吗?

时间:2015-11-11 作者:Galivan

我只对整个表进行选择,而该表是在一个变量中定义的:

$table = $wpdb->prefix . \'members\';
是否必须将参数绑定到此变量?

这导致了一个错误:

$result = $wpdb->get_results($wpdb->prepare("SELECT * FROM %s", $table, ARRAY_A));
但如果跳过“%s”,也会出现错误:

$result = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table", ARRAY_A));
在这种情况下,我应该跳过“准备”吗?

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

否,您不想交换出表名。如果这样做,表名将被括在引号中,并将触发SQL错误。尝试:

$table = $wpdb->prefix . \'members\';
$qry = $wpdb->prepare("SELECT * FROM %s", $table); 
var_dump($qry);

$qry = "SELECT * FROM $table";
var_dump($result);
第一个字符串是无效的SQL。如果您有一个正确名称的表,第二个应该可以使用。

prepare() 旨在对用户提供的数据进行操作,这些数据可能来自恶意来源的可疑数据。您不需要交换数据,例如表名,这些数据不是来自可疑的源。

您想要的是:

$table = $wpdb->prefix . \'members\';
$qry = "SELECT * FROM $table";
$result = $wpdb->get_results($qry, ARRAY_A);
var_dump($result); 
顺便说一下,您的括号在这里是错误的(即使其余部分有效):

$result = $wpdb->get_results($wpdb->prepare("SELECT * FROM %s", $table, ARRAY_A));
TheARRAY_A 是对prepare 而不是get_results. 应该是(尽管如上所述,值交换是错误的):

$result = $wpdb->get_results(
  $wpdb->prepare("SELECT * FROM %s", $table), 
  ARRAY_A
);

SO网友:CapitanFindus

这只是一个错误的括号关闭,$wpdb->prepare 仅需要query stringquery parameters. 然后,打开get_results 您可以定义需要什么样的结果,因此:

$result = $wpdb->get_results(
    $wpdb->prepare( "SELECT * FROM %s", $table ),
    ARRAY_A
) or die ( $wpdb->last_error );
编辑:您可以检查$wpdb 使用此更新代码导致的上一个SQL错误

相关推荐

他们有什么办法来扩展WPDB类并覆盖默认的查询函数吗

我试图通过扩展wpdb类并覆盖自定义查询函数来获取带有回溯的查询数据。如果我创建db的符号链接,代码运行良好。php,但如果我尝试在插件文件中执行它,则无法直接工作。代码为:<?php if ( ! defined( \'SAVEQUERIES\' ) ) { define( \'SAVEQUERIES\', true ); } class My_DB extends wpdb { function __construct( $db