试图把for i +放在mysql查询里面,php wordpress

时间:2016-08-03 18:37:54

标签: php mysql arrays wordpress pdo

你们有没有办法把for i +放在一个mysql查询中,还是以任何方式让字符串取决于数组的数量?

我必须这样做的原因是因为我使用wordpress而且我必须使用IN()内爆一个数组。不幸的是,如果我必须使用$wpdb->prepare,并且我需要使用%s,如果我使用%s,我的字符串必须匹配%s。当然,我可以使用foreach,但如果我的数组有100个值,那么查询将被调用100次。而且,如果我不使用$wpdb->prepare,我也没有问题,但它不安全。

我在想PDO,但我对PDO并不熟悉,我认为$wpdb->prepare比PDO更安全。所以,我被震惊了。试图找出一种在数组量上动态创建字符串的方法。

任何想法,欣赏。



<?php

$arg = array('a','b','c');//i don't use foreach because my array is so long that will call query hundred times.

$t= implode(',', array_fill(0, count($arg),'%s'));
$sym = $wpdb->get_results( $wpdb->prepare("
SELECT DISTINCT disease FROM dis WHERE disease IN ($t)
" ,for( $i= 0 ; $i <= count($arg); $i++ )
{
echo $arg[$i];
}));


?>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

我知道您出于安全原因尝试使用$wpdb->prepare,但我认为$wpdb->prepare不适合您的情况。您正在创建一个大型查询字符串,您似乎遇到此函数的问题。 wordpress文档指出$wpdb->prepare并不适合所有情况。让我们寻找替代方案,同时确保它对我们的查询足够安全。如果我们浏览了esq_sql doc

  

在99%的情况下,您可以使用$ wpdb-&gt; prepare()代替,这就是   推荐的方法。此功能仅适用于极少数情况   你不能轻易使用$ wpdb-&gt; prepare()。

我认为我们有这些罕见的情况之一,我们不能轻易使用$wpdb->prepare()

  

注意:请注意正确使用此功能。它只会   要在查询中的字符串中使用的转义值。这就对了   仅提供转义为将在引号内的值的转义   SQL(如field ='{$ escaped_value}')。

我们的价值在引号内,所以我们符合这个条件

  

如果您的值不在引号范围内,您的代码仍将是   易受SQL注入攻击。例如,这是脆弱的,   因为转义的值未被SQL中的引号包围   查询:ORDER BY {$ escaped_value}。因此,这个功能没有   转义未加引号的数字值,字段名称或SQL关键字。

这个警告不适用于我们的情况。

由于这些原因,我认为您可以在不损害安全性的情况下使用esq_sql。这样的事情应该有效:

<?php
$arg = array( 'a', 'b', 'c' );
$arg_str = " ";

foreach ( $arg as $val ) {
    $arg_str .= "'" . esc_sql( $val ) ."', ";
}
// Remove the last comma
$arg_str = substr ( $arg_str, 0, strlen( $arg_str ) - 2 );

$result = $wpdb->get_results( "SELECT DISTINCT disease FROM dis 
                               WHERE disease IN ( " . $arg_str . " )" );

?>