Ассоциативный массив PHP Implode
Итак, я пытаюсь создать функцию, которая генерирует строку запроса SQL на основе многомерного массива.
Пример:
function createQueryString($arrayToSelect, $table, $conditionalArray) {
$queryStr = "SELECT ".implode(", ", $arrayToSelect)." FROM ".$table." WHERE ";
$queryStr = $queryStr.implode(" AND ",$conditionalArray); /*NEED HELP HERE*/
return $queryStr;
}
$columnsToSelect = array('ID','username');
$table = 'table';
$conditions = array('lastname'=>'doe','zipcode'=>'12345');
echo createQueryString($columnsToSelect, $table, $conditions); /*will result in incorrect SQL syntax*/
как вы можете видеть, мне нужна помощь с третьей строкой, которая в настоящее время печатает
SELECT ID, имя пользователя FROM table WHERE lastname И zipcode
но он должен печатать
SELECT ID, имя пользователя FROM table WHERE lastname = 'doe' И zipcode = '12345'
Ответы
Ответ 1
На самом деле вы не взрывы многомерного массива. $- ассоциативный массив.
Просто используйте цикл foreach внутри вашей функции createQueryString(). Что-то вроде этого должно работать, обратите внимание на непроверенный.:
$terms = count($conditionalArray);
foreach ($conditionalArray as $field => $value)
{
$terms--;
$queryStr .= $field . ' = ' . $value;
if ($terms)
{
$queryStr .= ' AND ';
}
}
Примечание. Чтобы предотвратить инъекцию SQL, значения должны быть экранированы и/или кавычками, если это необходимо/необходимо для используемой базы данных. Не просто копировать и вставлять; думаю!
Ответ 2
function implodeItem(&$item, $key) // Note the &$item
{
$item = $key . "=" . $item;
}
[...]
$conditionals = array(
"foo" => "bar"
);
array_walk($conditionals, "implodeItem");
implode(' AND ', $conditionals);
Неподтвержденный, но что-то вроде этого должно работать. Таким образом, вы также можете проверить, является ли $item массивом и использовать IN для этих случаев.
Ответ 3
Вам нужно будет написать еще одну функцию для обработки $conditionalArray
, т.е. обработки $key => $value
и обработки типов, например. применяя кавычки, если они являются строками.
Вы имеете дело с условием =
? Что насчет LIKE
, <
, >
?
Ответ 4
Прости меня, если он не слишком сексуальный!
$data = array('name'=>'xzy',
'zip'=>'3432',
'city'=>'NYK',
'state'=>'Alaska');
$x=preg_replace('/^(.*)$/e', ' "$1=\'". $data["$1"]."\'" ',array_flip($data));
$x=implode(' AND ' , $x);
Таким образом, выход будет выглядеть следующим образом:
name='xzy' AND zip='3432' AND city='NYK' AND state='Alaska'
Ответ 5
Я бы посоветовал создать автоматическое создание условных выражений.
Ваш случай слишком локальный, в то время как может быть много других операторов - LIKE, IN, BETWEEN, <, > и т.д.
Некоторая логика, включая несколько И и ИЛИ.
Лучший способ - ручной способ.
Я всегда так делаю.
if (!empty($_GET['rooms'])) $w[]="rooms='".mesc($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mesc($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'";
Хотя если вы все еще хотите его с помощью этого простого массива, просто повторите его, используя
foreach ($conditions as $fieldname => $value)...
а затем объединить эти переменные так, как вам нужно. у вас есть 2 варианта: сделайте еще один массив из этого с парами field='value'
, а затем вставьте его или просто конкатенируйте, а конец trailing AND
в конце.
Ответ 6
Я использую вариацию этого:
function implode_assoc($glue,$sep,$arr)
{
if (empty($glue)) {$glue='; ';}
if (empty($sep)) {$sep=' = ';}
if (is_array($arr))
{
foreach ($arr as $k=>$v)
{
$str .= $k.$sep.$v.$glue;
}
return $str;
} else {
return false;
}
};
Это грубо, но работает.
Ответ 7
Вот рабочая версия:
//use: implode_assoc($v,"="," / ")
//changed: argument order, when passing to function, and in function
//output: $_FILES array ... name=order_btn.jpg / type=image/jpeg / tmp_name=G:\wamp\tmp\phpBDC9.tmp / error=0 / size=0 /
function implode_assoc($arr,$glue,$sep){
$str = '';
if (empty($glue)) {$glue='; ';}
if (empty($sep)) {$sep=' = ';}
if (is_array($arr))
{
foreach ($arr as $key=>$value)
{
$str .= $key.$glue.$value.$sep;
}
return $str;
} else {
return false;
}
}
Ответ 8
Я знаю, что это относится к типу pdo mysql.. но то, что я делаю, это методы pdo wrapper, и в этом случае я выполняю эту функцию, которая помогает построить строку, поскольку мы работаем с ключами, нет возможного способа ввода mysql, поскольку я знаю ключи, которые я определяю/принимаю вручную.
представьте эти данные:
$data=array(
"name"=>$_GET["name"],
"email"=>$_GET["email"]
);
вы определили методы utils...
public static function serialize_type($obj,$mode){
$d2="";
if($mode=="insert"){
$d2.=" (".implode(",",array_keys($obj)).") ";
$d2.=" VALUES(";
foreach ($obj as $key=>$item){$d2.=":".$key.",";}
$d2=rtrim($d2,",").")";}
if($mode=="update"){
foreach ($obj as $key=>$item){$d2.=$key."=:".$key.",";}
}
return rtrim($d2,",");
}
тогда построитель массива запросов свяжется (я могу использовать ссылку на прямой массив, но упростить):
public static function bind_build($array){
$query_array=$array;
foreach ($query_array as $key => $value) { $query_array[":".$key] = $query_array[$key]; unset($query_array[$key]); } //auto prepair array for PDO
return $query_array; }
тогда вы выполняете...
$query ="insert into table_x ".self::serialize_type( $data, "insert" );
$me->statement = @$me->dbh->prepare( $query );
$me->result=$me->statement->execute( self::bind_build($data) );
Вы также можете легко перейти к обновлению с помощью...
$query ="update table_x set ".self::serialize_type( $data, "update" )." where id=:id";
$me->statement = @$me->dbh->prepare( $query );
$data["id"]="123"; //add the id
$me->result=$me->statement->execute( self::bind_build($data) );
Но самая важная часть здесь - функция serialize_type
Ответ 9
Попробуйте это
function GeraSQL($funcao, $tabela, $chave, $valor, $campos) {
$SQL = '';
if ($funcao == 'UPDATE') :
//Formata SQL UPDATE
$SQL = "UPDATE $tabela SET ";
foreach ($campos as $campo => $valor) :
$SQL .= "$campo = '$valor', ";
endforeach;
$SQL = substr($SQL, 0, -2);
$SQL .= " WHERE $chave = '$valor' ";
elseif ($funcao == 'INSERT') :
//Formata SQL INSERT
$SQL = "INSERT INTO $tabela ";
$SQL .= "(" . implode(", ", array_keys($campos) ) . ")";
$SQL .= " VALUES ('" . implode("', '", $campos) . "')";
endif;
return $SQL;
}
//Use
$data = array('NAME' => 'JOHN', 'EMAIL' => '[email protected]');
GeraSQL('INSERT', 'Customers', 'CustID', 1000, $data);