0

我有一个从提供的参数构建 MySQL 查询的函数。我目前的代码是:

($args 可以是一个空数组或最多一组 5 个 field_names=>array_of_ids ...)

if( !(empty( $args )) )
{
    $flag = 0;
    $sql_append = '';

    foreach( $args as $field_name => $id_array )
    {
        if( $flag == 0 )
        {
            $where_connector = " WHERE ";
            $flag = 1;
        }
        else
        {
            $where_connector = " AND ";
        }

        ${ $field_name . '_string'} = join(',',${ $field_name . '_ids'});
        $sql_append .= $where_connector . 'link_id IN ($ids)";
    }        
}

我是自学成才的,所以经常担心最佳实践。我似乎记得某种处理参数的函数,也许以一种可以更有效地应用在这里的方式。有任何想法吗?

4

2 回答 2

2

我想说这里更大的问题是您应该使用某种技术来保护您的代码免受 SQL 注入。例如,PHP 的内置 PDO 类提供了一种非常简单的方法来执行此操作:http ://www.php.net/manual/en/pdo.prepared-statements.php 。

但是,一般来说,如果您想要一个在第一次或最后一次迭代中表现不同的循环,那么您的方法还不错。另一个明显的方法是在循环外进行第一次(或最后一次)迭代然后在循环体内执行相同的迭代。

于 2013-08-08T22:55:34.277 回答
2

要从 $fieldname=>$id_array 数组中巧妙地构造 WHERE $fieldname IN($ids) 子句,您可以试试这个:)

function buildWhereIns(array $args)
{
    if(!is_array($args) || empty($args)) return ""; 

    $ids = array_map(function($item){ 
    return implode(',',$item);
    }, array_values($args));

    $fields = array_map(function($item,$id){ 
    return $item.' IN('.$id.') ';
    }, array_keys($args),$ids);

    return = count($fields) > 0 ? count($fields) > 1 ? " WHERE " . implode(' AND ', $fields) : " WHERE " . array_shift($fields) : ""; 
}
于 2013-08-08T23:44:36.010 回答