PHP интегрируют ассоциативный массив

Таким образом, я пытаюсь создать функцию, которая генерирует строку 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'

12
задан Benubird 5 February 2013 в 11:59
поделиться

4 ответа

На самом деле вы не имплодируете многомерный массив. $conditions - это ассоциативный массив.

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

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

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

16
ответ дан 2 December 2019 в 05:03
поделиться

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

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

2
ответ дан 2 December 2019 в 05:03
поделиться

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

1
ответ дан 2 December 2019 в 05:03
поделиться
function implodeItem(&$item, $key) // Note the &$item
{
  $item = $key . "=" . $item;
}

[...]

$conditionals = array(
  "foo" => "bar"
);

array_walk($conditionals, "implodeItem");
implode(' AND ', $conditionals);

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

10
ответ дан 2 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: