Таким образом, я пытаюсь создать функцию, которая генерирует строку 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*/
поскольку Вы видите, что я нуждаюсь в помощи с 3-й строкой, поскольку она в настоящее время печатает
ВЫБЕРИТЕ идентификатор, таблица FROM имени пользователя ГДЕ lastname И индекс
но это должно печатать
ВЫБЕРИТЕ идентификатор, таблица FROM имени пользователя ГДЕ lastname = 'самка' И индекс = '12345'
На самом деле вы не имплодируете многомерный массив. $conditions - это ассоциативный массив.
Просто используйте цикл foreach внутри вашей функции createQueryString(). Что-то вроде этого должно работать, обратите внимание, что это не проверено.:
$terms = count($conditionalArray);
foreach ($conditionalArray as $field => $value)
{
$terms--;
$queryStr .= $field . ' = ' . $value;
if ($terms)
{
$queryStr .= ' AND ';
}
}
Примечание: Чтобы предотвратить SQL-инъекции, значения должны быть экранированы и/или заключены в кавычки, как это уместно/необходимо для используемой БД. Не просто копируйте и вставляйте, думайте!
Вам нужно будет написать другую функцию для обработки $ conditionalArray
, то есть обработки $ key => $ value
и обработки типов, например применение кавычек, если они строковые.
Вы просто имеете дело с условием =
? А как насчет LIKE
, <
, >
?
Я бы не советовал создавать автоматические условные выражения.
Ваш случай слишком локален, хотя может быть много других операторов - 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'
, а затем сжать его, или просто объединить, и в конце substr завершают И
.
function implodeItem(&$item, $key) // Note the &$item
{
$item = $key . "=" . $item;
}
[...]
$conditionals = array(
"foo" => "bar"
);
array_walk($conditionals, "implodeItem");
implode(' AND ', $conditionals);
Не проверено, но что-то вроде этого должно работать. Таким образом можно также проверить, является ли $item массивом, и использовать IN для этих случаев.