我需要使用生成的字符串作为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;
答案 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。