在mysql中为带有变量的数组使用生成的字符串

92dk7w1h  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(381)

我需要在mysql循环中使用生成的字符串作为数组。字符串/数组内置于 $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;
muk1a3rh

muk1a3rh1#

结构化数据是结构化数据。可以是字符串或数组。我搞不懂你的一些代码。字符串中的数组。。。除非你想用评估。我想那有点把你的问题弄糊涂了。
您需要考虑的一件事是您将如何暴露于sql注入。基本上从不信任用户对吗?因此,您可以在代码中执行类似predfine的操作,即允许的列。如果提交的表单引用了未列入白名单的内容,请停止!此外,还必须考虑转义用户提供的值。
我想让我的函数接受一个已知的,对它需要传递的东西有意义的参数。。。首先清理这些内容,然后将一些最有意义的数据类型传递给函数。也许是。。。

/**
 * @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'
                        ]);

也许看看一些框架或者类似orm的理论?可以看到select语句的oop表示的一些好例子。使动态查询构建更加容易。最后还要干杯。

相关问题