Sql syntax error

时间:2012-08-29 作者:Ronin

有时在我的错误日志中,我会出现以下错误:

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 \'\' at line 1    
    SELECT * 
    FROM c_posts 
    WHERE id = , 
    do_action(\'wp_ajax_inline-save\'), 
    call_user_func_array, 
    wp_ajax_inline_save, 
    edit_post, 
    wp_update_post, 
    wp_insert_post, 
    wp_transition_post_status, 
    do_action(\'transition_post_status\'), 
    call_user_func_array, 
    apt_check_required_transition, 
    apt_publish_post, 
    W3_Db->query
如何修复此问题?

我认为这个插件有错误。这是一段代码:

/**
  * Function to check whether scheduled post is being published. If so, apt_publish_post should be called.
  *
  * @param $new_status
  * @param $old_status
  * @param $post
  * @return void
  */
 function apt_check_required_transition($new_status=\'\', $old_status=\'\', $post=\'\') {
global $post_ID; // Using the post id from global reference since it is not available       in $post object. Strange!

if (\'publish\' == $new_status) {
    apt_publish_post($post_ID);
}
 }

 /**
 * Function to save first image in post as post thumbmail.
 */
 function apt_publish_post($post_id)
  {
global $wpdb;

// First check whether Post Thumbnail is already set for this post.
if (get_post_meta($post_id, \'_thumbnail_id\', true) || get_post_meta($post_id, \'skip_post_thumb\', true)) {
    return;
}

$post = $wpdb->get_results("SELECT * FROM {$wpdb->posts} WHERE id = $post_id");

// Initialize variable used to store list of matched images as per provided regular expression
$matches = array();

// Get all images from post\'s body
preg_match_all(\'/<\\s*img [^\\>]*src\\s*=\\s*[\\""\\\']?([^\\""\\\'>]*)/i\', $post[0]->post_content, $matches);

if (count($matches)) {
    foreach ($matches[0] as $key => $image) {
        /**
         * If the image is from wordpress\'s own media gallery, then it appends the thumbmail id to a css class.
         * Look for this id in the IMG tag.
         */
        preg_match(\'/wp-image-([\\d]*)/i\', $image, $thumb_id);
        $thumb_id = $thumb_id[1];

        // If thumb id is not found, try to look for the image in DB. Thanks to "Erwin Vrolijk" for providing this code.
        if (!$thumb_id) {
            $image = substr($image, strpos($image, \'"\')+1);
            $result = $wpdb->get_results("SELECT ID FROM {$wpdb->posts} WHERE guid = \'".$image."\'");
            $thumb_id = $result[0]->ID;
        }

        // Ok. Still no id found. Some other way used to insert the image in post. Now we must fetch the image from URL and do the needful.
        if (!$thumb_id) {
            $thumb_id = apt_generate_post_thumb($matches, $key, $post[0]->post_content, $post_id);
        }

        // If we succeed in generating thumg, let\'s update post meta
        if ($thumb_id) {
            update_post_meta( $post_id, \'_thumbnail_id\', $thumb_id );
            break;
        }
    }
}
 }// end apt_publish_post()

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

SQL语句中的错误就在最后,

SELECT * 
FROM c_posts 
WHERE id = , 
没有提供值来检查id 柱这很可能是因为在形成和执行查询之前,没有检查ID字段中的空白值。检查函数中的代码apt_publish_post 确保要插入到查询中的值id 为非空且为正整数。

Update

现在您已经提供了apt_publish_post, 很清楚为什么会发生这种情况。

  • apt_check_required_transition 挂在transition_post_status 操作,它接受三个参数,$old\\u status,$new\\u status和$post。如果正确注册add_action, 所有三个变量都保证定义。

    add_action( \'transition_post_status\', \'apt_check_required_transition\', 10, 3);

    <必须提供add\\u action的最后两个参数:$priority$num_arguments; 这是我的$priority = 10$num_arguments = 3, 要对应参数的数量transition_post_status 行动用品
  • apt_check_required_transition 因此将接受$post 对象作为第三个参数,其ID为$post->ID 应传递给apt\\u publish\\u post

  • apt_publish_post 应该对其论点进行一些基本的合理性检查,$post_id:

    if( ( $post_id = (int) $post_id ) < 1 ) return;

    <这只是PHP中检查类型和域有效性的各种方法之一$wpdb->prepare() 创建SQL语句时。这增加了另一层针对注入攻击的保护。

    $post = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE id = %d", $post_id ) );

    <尽管如此get_post() WordPress API函数是一种更好的方法,可以在给定post ID的情况下获取post对象:
  • $post = get_post( $post_id );

    <这与您当前的方法不同,因为您获得的是单个帖子,而不是使用$wpdb->get_results()
  • 您也可以将提供的$post对象传递给apt_check_required_transition 直接发送至apt_publish_post 而不是获取其ID然后再次查找。这将消除对健全性检查的需要,因为在这种情况下总是会定义$post。

  • 结束

    相关推荐

    删除多站点子站点时未删除WPML表,需要帮助清除我的SQL文件!

    我正在为一个需要多语言站点的客户构建一个WP多站点。在选择WP Multisite之前,我购买并试用了WPML。然而,那个插件不适合这份工作,所以我删除了它并得到了退款。然而,现在这似乎又回来困扰我了。现在,在使用Multisite时,我一直在使用Backupbuddy导出和复制我的站点,以用于不同的测试目的。现在出现了一些问题,尽管这是一个非常小的页面,但数据库非常庞大!SQL是500兆,我甚至在MyPhpAdmin中都看不到。我把SQL文件放在办公桌上,当我最终打开它时,它到处都是臃肿的WPML表,这