通过PHP将带有多个以逗号分隔的值的变量传递给sql语句

时间:2013-04-24 21:27:29

标签: php mysql wordpress

我看了遍遍各个网站,找不到我正在寻找的那个简单的答案 - 可能是因为它不存在,但是......可能是因为我不知道要搜索的正确术语。 / p>

好吧,所以,我有一个变量 - 它是一个数组中的键值对,它正在传递给我的函数。关键是args [comments_ mentioned],这个值是为我动态生成的 - 它始终是数字,用逗号分隔(即1,2,3,4,5)

所以,只是要非常清楚:

         $args[comments_mentioned] == "1,2,3,4"; //could be any amount of number, not just 1,2,3,4,5

我想将它作为变量传递给sql语句,以便在“IN”子句中使用,如下所示:

         $sr_sql = <<<SQL
         SELECT *
         FROM $wpdb->commentmeta
         WHERE meta_value = %s
         AND comment_ID in ($args[comments_mentioned])
         ORDER BY meta_id DESC
         SQL; 

然后,使用wordpress准备并获得结果

        $sr_query = $wpdb->prepare( $sr_sql, $args[user_id]) );
        //receive the correct sql statement, and plug 'er in.
        $sr_comment_rows = $wpdb->get_results($sr_query);

并运行我的foreach循环:

        foreach ($sr_comment_rows as $sr_comment) {
            $sResults .= 'do something with $sr_comment';
        }

现在,我意识到上面的代码不起作用 - 我不能像那样只传递变量。但是,我不能将它作为字符串(%s)传递,因为它将它包装在'1,2,3,45'中,因此它查找整个字符串,而不是每个数字。我不能将它作为int(%d)传递,因为逗号...

在其他帖子中,他们提到创建临时表或变量,但是,我不确定这是否是在mysql中执行此操作的正确方法,或者在我执行操作后如何引用它。

所以,我该怎么做?优先使用的实际代码;)

感谢您的阅读和帮助!

2 个答案:

答案 0 :(得分:0)

如果您无法规范化数据,其中一个选项是用逗号括起您的字符串,使其为",1,2,3,4,"然后您可以执行以下操作:

AND LOCATE( CONCAT(',',comment_ID,',') , ($args[comments_mentioned]) )

如果找到例如,它将匹配。 ',3,'中的',1,2,3,4,'(以3为例)

答案 1 :(得分:0)

我相信这应该足够了:

$params = $args[comments_mentioned];
$table = $wpdb->commentmeta;
$sr_sql = "
         SELECT *
         FROM $table
         WHERE meta_value = %s
         AND comment_ID in ($params)
         ORDER BY meta_id DESC
         ";

结果如下:

SELECT *
FROM table_on_variable
WHERE meta_value = %s
         AND comment_ID in (1,2,3,4)
         ORDER BY meta_id DESC

如果您的主要问题与in子句有关,那么如果您使用双引号和单个变量,则不会出现问题。