PHP - генерирует динамический оператор IF для mysql - PullRequest
1 голос
/ 12 августа 2011

Я борюсь с этим.У меня есть массив ключей / значений неопределенного размера, который я хочу использовать для генерации динамического оператора if для запроса MySQL.

Мой массив выглядит следующим образом:

    $arr = array("a" => "b", "c" => "d", "e" => "f");

Учтите, что окончательное выражение MySQL будет выглядеть примерно такЯ не уверен, как изменить массив так, чтобы он не заканчивался бесконечным циклом.Я хотел бы вызвать его следующим образом:

    $if_stmt = generate_if($arr, "default_value");

Где "default_value" - это значение по умолчанию, если никакой другой логический тест не соответствует значению true.До сих пор я

    function generate_if(&$arr, $default_value = "default_value"){
        foreach($arr as $orig => $new){

        }
    }

и не знаю, как поступить .. Любая помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 12 августа 2011

Учитывая, что ваш SQL правильный:

function generate_if($arr, $default_value = "default_value") {
    echo 'SELECT';
    foreach($arr as $k => $v) {
        echo ' IF(field1 = "', $k,'", "', $v,'", ';
    }
    echo $default_value,
      str_repeat(')', count($arr)),
      ' AS value FROM tbl;';
}

Я думаю, вы можете избежать использования ссылок. Они НЕ ускоряют работу.

1 голос
/ 12 августа 2011

Если я хорошо понимаю, что вы хотите:

Гадкий путь:

$ending = '';
$sql = 'SELECT ';
foreach ($arr as $orig => $new) {
    $sql    .= 'IF(field1 = ' . $orig . ', ' . $new . ',';
    $ending .= ')';
}

$sql .= $default_value . $ending . ' AS value FROM tbl';

Возможно, вы можете рассказать нам больше о том, что вы хотите сделать, потому что я не уверен, что вы идете в правильном направлении.

0 голосов
/ 12 августа 2011

Я рекомендую использовать оператор CASE вместо вашего запутанного IF / ELSE:

$sql = 'SELECT CASE ';
for($array as $if => $then) {
  $sql .= sprintf('WHEN field1 = \'%s\' THEN \'%s\' ',
    mysqli_real_escape_string($if),
    mysqli_real_escape_string($then));
}
$sql .= sprintf('ELSE \'%s\' END CASE AS value ',
  mysql_real_escape_string($default_value));
$sql .= 'FROM table1';
...