数据库选择的WordPress快捷码属性?

时间:2018-03-09 作者:Peter

我创建了一个带有属性的小快捷码函数,以检查属性是否得到正确处理。就是这样,现在我想在SELECT语句中使用该属性。但数据库没有提供任何值。WHERE条件中没有变量的SQL语句正常。

为了测试短代码,我在Wordpress文本页中添加了这三行代码,但它们都不起作用:

 [simplelist text=Beatles]
 [simplelist text=\'Beatles\']
 [simplelist text="Beatles"]
这是我的函数代码。php:

 <?php
 ....

 function get_list( $atts )
 { 
   $atts = shortcode_atts( array(
       \'text\' => \'\',
       ), $atts);


   global $wpdb;

   $simplelist = $wpdb->get_results("SELECT `Row1`, `Row2` 
                                      FROM  `table` 
                                      WHERE `Row1` = " . $atts[text] . "
                                      ORDER BY `Row1` ASC");

   $Result =   .... some stuff here ...
   return $Result;
 }
 add_shortcode(\'simplelist\', \'get_list\' );
 ?>
当我删除WHERE条件时,我会得到完整的表结果。我需要一些在WHERE条件下使用属性值的帮助。

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

下面是SQL查询:

  $simplelist = $wpdb->get_results("SELECT `Row1`, `Row2` 
                                      FROM  `table` 
                                      WHERE `Row1` = " . $atts[text] . "
                                      ORDER BY `Row1` ASC");
让我们假装我们是电脑,在脑海中运行它,首先发生的事情是:

$atts[text] // fatal error!
text 未定义,您缺少引号,但让我们修复它,我们会遇到一个新问题。如果此值为test 结果是:

                              SELECT `Row1`, `Row2` 
                                      FROM  `table` 
                                      WHERE `Row1` = test
                                      ORDER BY `Row1` ASC
test 缺少引号,这就是您的查询无法工作的原因。

巨大的安全漏洞,你可能会想,“汤姆!让我们用引号括起来,一切都会好起来的!”,但我们有一个问题。不需要准备语句,所以我们所需要做的就是去掉引号并插入任意SQL语句。现在,呈现短代码的任何地方都可以用来转储任何表、删除表、修改数据等等。

要解决此问题并防止原始问题,请使用wpdb prepare,例如:

$table_name = "wp_myTable";
$myID = 12;

$wpdb->query( $wpdb->prepare( "UPDATE `$table_name` SET `your_column_1` = 1 WHERE `$table_name`.`your_column_id` = %d", $myID ) );
prepare 将确保以正确的格式和正确的数据类型将值安全插入到查询字符串中。

或者,您可以使用一个自定义的post类型,并通过免费的归档文件/URL/模板/UI/缓存/REST端点/等来避免所有痛苦

SO网友:J.BizMai

首先,您似乎遇到了一个mysql错误。$attr[text] 是一个字符串,因此需要用简单引号将其括起来:

Row1 = \'{$atts[text]}\'

然后$wpdb->get_results() 函数默认返回一个对象。

如果需要PHP数组作为结果:

使用ARRAY_A 第二个论点如下:$wpdb->get_results( $query, ARRAY_A );

Complete function

function get_list( $atts )
{ 
    $atts = shortcode_atts( array(
            \'text\' => \'\',
         ), 
         $atts );


   global $wpdb;

   $query = "SELECT Row1, Row2 FROM  table WHERE Row1 = \'{$atts[text]}\' ORDER BY Row1 ASC ;";
   $results = $wpdb->get_results( $query, ARRAY_A );

   if( !empty( $results ) ){
      if( count( $results === 1 ) ){
          return $results[0];
      }else{
          return $results;
      }   
   }else{
      return false;
   }

}

结束

相关推荐

Calculations in functions.php

我为自己创建了一个发票主题,并试图在自定义列中获取发票总额。我已经尝试调整模板页面中使用的代码,以便在函数中显示这一点。php文件,但它不工作。我的乘法操作数出现了一个操作数错误,我不知道为什么。这是我的代码(如有任何帮助,将不胜感激)。if( $column_name == \'invoice_total\' ) { $hours = 0; // This allows counting of each sub_field //* Set repeater va