【问题标题】:SQL Syntax Error after updating to WordPress 4.8.2更新到 WordPress 4.8.2 后出现 SQL 语法错误
【发布时间】:2018-04-11 16:25:55
【问题描述】:

我一直在高级自定义字段插件 (load_field) 中使用挂钩,它将对象从我的数据库中的表加载到 ACF 选择字段。表格 ('wp_new_royalsliders') 是由 RoyalSlider 图像滑块插件创建的,所以我使用钩子用滑块名称填充选择字段。

这个功能已经运行了很长时间,但最近停止工作 - 我认为在将核心更新到 4.8.2 后:

    add_filter('acf/load_field/name=media_gallery_slider', 'my_acf_royalslider_choices');

    function my_acf_royalslider_choices($field){

      $field['choices'] = array();

      global $wpdb;

      $query = $wpdb->prepare('SELECT * FROM %1$s ORDER BY ID ASC', 'wp_new_royalsliders');
      $results = $wpdb->get_results($query);

      if(!empty($results)) :

      foreach($results as $result) :

          $value = $result->id;
          $label = $result->name;

          $field['choices'][ $value ] = $label;

      endforeach;
      endif;
      return $field;

    }

当我打开调试时出现错误:

WordPress 数据库错误:[You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%1$s ORDER BY ID ASC' at line 1] SELECT * FROM %1$s ORDER BY ID ASC

【问题讨论】:

  • %1$s 看起来像自定义准备语法.. MySQL 不允许使用变量表名进行准备查询...查看自定义准备语法没有被替换的错误 annymore..
  • 感谢您的状态报告。有问题吗? WordPress 已更新至包含 SQL 注入安全漏洞修复程序的版本;该代码在新版本中表现出不同的行为,并且...您的问题是...?

标签: mysql wordpress advanced-custom-fields


【解决方案1】:

当你传入一个硬编码的字符串值时,你不需要占位符,你可以直接使用

$query = $wpdb->prepare('SELECT * FROM wp_new_royalsliders ORDER BY ID ASC');

如果你想变得花哨和便携,你可能会选择

$query = $wpdb->prepare('SELECT * FROM ' . $wpdb->prefix . 'new_royalsliders ORDER BY ID ASC');

所以它也适用于其他前缀,但如果这是一个非常定制的东西,不会进入任何其他网站,那可能就没有必要了。

似乎其他人也注意到了这种可能性的消除,请参阅this request

更新:由于 $wpdb->prepare() 需要第二个参数(因为它的工作是转义变量输入以在 SQL 中使用),它可能会抱怨。解决方法:去掉它,直接把你的SQL给get_results:

$results = $wpdb->get_results('SELECT * FROM ' . $wpdb->prefix . 'new_royalsliders ORDER BY ID ASC');

【讨论】:

  • 嗨 Janh,您的解决方案解决了一个问题,但又产生了另一个问题 :) 选择选项现在出现,但我收到警告:警告:wpdb::prepare() 缺少参数 2?
  • 啊,对。您实际上可以完全删除 $wpdb->prepare(),因为它所做的只是在 SQL 中转义变量,因此您可以安全地执行该 SQL。我会更新我的答案。
  • 太完美了。谢谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2021-05-09
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多