将生成的字符串用于MySQL中带有变量的数组

时间:2018-10-16 20:57:46

标签: php mysql arrays

我需要使用生成的字符串作为MySQL-Loop中的数组。 字符串/数组是从$argumentarray参数内置到$rows中的,以后应用作multiSQLarray[]的数组

该函数称为:

multiSQL('**id,title,description,link**','menu')

该字符串正确生成为

array('id' => $result['id'],'title' => $result['title'],'description' => $result['description'], 'link' => $result['link'])

但是不是将其用作数组的字符串,而是将它添加到sql中每个结果的数组中

Array ( [0] => array('id' => $result['id'],'title' => $result['title'],'description' => $result['description'], 'link' => $result['link']) [1] => array('id' => $result['id'],'title' => $result['title'],'description' => $result['description'], 'link' => $result['link']) ) 

我期望的是作为数组的SQL结果

Array ( [0] => Array ( [id] => 1 [title] => Customers [description] => Display the Customer Dashboard [link] => index.php ) [1] => Array ( [id] => 2 [title] => Server [description] => Display all Servers [link] => servers.php ) )

我的代码:

function multiSQL($rows=null,$table=null,$select=null) {
    if(is_null($select)) {$filter="";} else { $filter = ' where '.$select; }
    global $pdo;
    $sql = 'SELECT '.$rows.' FROM '.$table.$filter.'';
    $connection =$pdo->prepare($sql);
    $connection->execute();
    $multiSQLarray = array();
    $arguments = explode(',',$rows);
    $argumentarray = "";
    $argumentscount=count($arguments);
    $loopcount = 1;
    foreach($arguments as $argument){

            if($loopcount==$argumentscount){
            $loopcount++;
            $argumentarray = $argumentarray.' \''.$argument.'\' => $result[\''.$argument.'\']';

            }
            else{
                $loopcount++;
            $argumentarray = $argumentarray.'\''.$argument.'\' => $result[\''.$argument.'\'],';
            }
    }
    $argumentarray = 'array('.$argumentarray.')';
    echo $argumentarray.'<br><br>';
    while ($result = $connection->fetch(PDO::FETCH_BOTH)) {
        //$multiSQLarray[] = array('id' => $result['id'], 'title'  => $result['title'], 'description'  => $result['description'], 'link'  => $result['link']);
        $multiSQLarray[] = $argumentarray;
        }
    print_r($multiSQLarray);
    return $multiSQLarray;

1 个答案:

答案 0 :(得分:0)

结构化数据是结构化数据。是字符串还是数组。我无法理解您的某些代码。字符串中的数组...除非您打算使用eval。我觉得这让您的问题有些困惑。

您需要考虑的一件事是您将如何暴露于SQL注入。基本上永远不信任用户权利?因此,您可以在代码中执行允许的列的预定义。如果提交的表单引用了未列入白名单的内容,请停止!另外,必须考虑转义用户提供的值。

我希望我的函数接受一个已知的,对于需要传入的参数有意义的参数……首先清除所有内容,然后传递一些对函数最有意义的数据类型。也许像...

/**
 * @param string $table
 * @param array $fields
 * @param array $criteria (key/value pairs where key is field and value is scalar)
 */
function buildQuery($table, $fields, $criteria) {

    $where = [];
    $whereVals = [];
    foreach($criteria as $k => $v) {
        $where[] = "({$k} = ?)";
        $whereVals[] = $v;
    }
    $where = implode(' AND ', $where);


    $fields = implode(', ', $fields);

    $sql = "SELECT {$fields} FROM {$table} WHERE {$where}";
    //eg. SELECT id, name, bar FROM fooTable WHERE (id = ?) AND (name = ?)

    $query = $pdo->prepare($sql);
    $retval = $query->execute($whereVals);

    return $retval;
}

$response = buildQuery( 'fooTable', 
                        ['id', 'name', 'bar'], 
                        [   
                            'id' => 5, 
                            'name' => 'john'
                        ]);

也许看一些框架或像Doctrine这样的ORM?可以看到select语句的OOP表示的一些很好的示例。使动态查询的构建变得容易得多。最后也要加一些DRYer。