你们有没有办法把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;
答案 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 . " )" );
?>