Ассоциативный массив 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, username FROM table WHERE lastname = 'doe' AND zipcode = '12345'

Solutions Collecting From Web of "Ассоциативный массив PHP Implode"

Вы на самом деле не взрывы многомерного массива. $ – ассоциативный массив.

Просто используйте цикл foreach внутри вашей функции createQueryString (). Что-то вроде этого должно работать, обратите внимание, что это непроверено:

 $terms = count($conditionalArray); foreach ($conditionalArray as $field => $value) { $terms--; $queryStr .= $field . ' = ' . $value; if ($terms) { $queryStr .= ' AND '; } } 

Примечание. Чтобы предотвратить инъекцию SQL, значения должны быть экранированы и / или указаны как соответствующие / необходимые для используемой БД. Не просто копировать и вставлять; думать!

 function implodeItem(&$item, $key) // Note the &$item { $item = $key . "=" . $item; } [...] $conditionals = array( "foo" => "bar" ); array_walk($conditionals, "implodeItem"); implode(' AND ', $conditionals); 

Непроверенный, но что-то вроде этого должно работать. Таким образом, вы также можете проверить, является ли $ item массивом и использовать IN для этих случаев.

Вам нужно будет написать еще одну функцию для обработки $conditionalArray , то есть обработать значение $key => $value и обрабатывать типы, например, применять кавычки, если они являются строками.

Вы имеете дело с = условие? Как насчет LIKE , < , > ?

Простите меня, если это не слишком сексуально!

  $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' 

Я бы посоветовал создать автоматическое создание условных выражений.
Ваш случай слишком локальный, а может быть много других операторов – 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' а затем вставьте его или просто конкатенируйте, а конец – в конец AND .

Я использую вариант этого:

 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; } }; 

Это грубо, но работает.

Вот рабочая версия:

 //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; } } 

Я знаю, что это относится к типу pdo mysql .. но то, что я делаю, это методы pdo wrapper, и в этом случае я выполняю эту функцию, которая помогает построить строку, поскольку мы работаем с ключами, нет никакого способа to mysql inject, так как я знаю ключи, которые я определяю / принимаю вручную.

представьте эти данные:

  $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 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,","); } 

то запрос bind array builder (я мог бы использовать ссылку прямого массива, но упростить):

  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; } с  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

Попробуй это

 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' => 'J@GMAIL.COM'); GeraSQL('INSERT', 'Customers', 'CustID', 1000, $data);