首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于数据库选择的Wordpress短代码属性?

用于数据库选择的Wordpress短代码属性?
EN

WordPress Development用户
提问于 2018-03-09 22:50:40
回答 2查看 3.9K关注 0票数 1

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

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

代码语言:javascript
运行
复制
 [simplelist text=Beatles]
 [simplelist text='Beatles']
 [simplelist text="Beatles"]

下面是我来自functions.php的代码:

代码语言:javascript
运行
复制
  '',
       ), $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条件下使用属性值方面的一些帮助。

EN

回答 2

WordPress Development用户

回答已采纳

发布于 2018-03-10 00:18:07

下面是SQL查询:

代码语言:javascript
运行
复制
  $simplelist = $wpdb->get_results("SELECT `Row1`, `Row2` 
                                      FROM  `table` 
                                      WHERE `Row1` = " . $atts[text] . "
                                      ORDER BY `Row1` ASC");

让我们假装自己是计算机并在头脑中运行它,首先发生的事情是:

代码语言:javascript
运行
复制
$atts[text] // fatal error!

text没有定义,您缺少引号,但是让我们修复它,我们会遇到一个新的问题。如果此值为test,则结果是:

代码语言:javascript
运行
复制
                              SELECT `Row1`, `Row2` 
                                      FROM  `table` 
                                      WHERE `Row1` = test
                                      ORDER BY `Row1` ASC

test缺少引号,这就是您的查询不能工作的原因。

大型安全孔

嗯,你可能在想“但是汤姆!让我们用引号包围它,一切都会好的!”,但我们有一个问题。没有准备语句,所以我们所需要做的就是跳出引号并插入任意SQL语句。现在,呈现短代码的任何地方都可以用于转储任何表、删除表、修改数据等等。

要解决这个问题,并防止原来的问题,请使用wpdb准备,例如:

代码语言:javascript
运行
复制
$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端点/等等。

票数 2
EN

WordPress Development用户

发布于 2018-03-10 00:11:48

首先,您似乎收到了mysql错误。$attr[text]是一个字符串,所以您需要用简单的引号包装它:

Row1 = '{$atts[text]}'

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

如果您希望结果是一个PHP数组:

使用ARRAY_A作为第二个参数,如:$wpdb->get_results( $query, ARRAY_A );

Complete函数

代码语言:javascript
运行
复制
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;
   }

}
票数 -1
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/296366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档