Смешивание условных типов - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь заменить кусок кода с жестко закодированными именами полей на тот, который динамически получает имена полей из запроса и работает в основном, но только до определенного момента, затем я получаю сообщение об ошибке.Это код, который я пытаюсь заменить циклом foreach с именами полей, который создает предложение WHERE:

if (strlen($Where) == 0 ) $Where .= " WHERE (";
    $Where .= "(" . $StorageArea . ")";
if (strlen($Where) > 0 ) $Where .= " AND ";
    $Where .= " (" . $StorageArea . ")";
 if (strlen($Location))
    $Where .= " OR (". $Location .")";
if (strlen($Size))
    $Where .= " OR (". $Size .")";
if (strlen($Winery))
    $Where .= " OR (". $Winery .")";
if (strlen($Brand))
    $Where .= " OR (". $Brand .")";
if (strlen($Appellation))
    $Where .= " OR (". $Appellation .")";
if (strlen($ReleaseYear))
    $Where .= " OR (". $ReleaseYear .")";
if (strlen($Varietal))
    $Where .= " OR (". $Varietal .")";
if (strlen($Status))
    $Where .= " OR (". $Status .")";
if (strlen($CountryName))
    $Where .= " OR (". $CountryName .")";
$Where .= " ) ";

Если нет опечатки, которую я пропустил, я не вижу проблемыздесь, в этом (пока не проверенном) цикле foreach, так может кто-нибудь посоветовать?Чтобы сохранить это просто и избежать большого количества if if, он использует как однострочные условные выражения, так и более обычные операторы ififif с использованием: и endif вместо {и}.Есть ли какое-то ограничение этого типа условного?Я всегда думал, что они являются взаимозаменяемыми, но, видимо, нет.

$i = 1;
$len = count(array_keys($queryField));
foreach (array_keys($queryField) as $row) :
    $i++:
    if ($row === 'ID') continue;
    if ($i == 1) :
        if (strlen($Where) == 1) $Where .= " WHERE (";
        $Where .= " (" . $$row . ") ";
        if (strlen($Where) > 1) $Where .= " AND ";
    elseif ($i > 1 && $i != $len) :
        if (strlen($$row)) $Where .= " OR (". $$row .")";
    elseif ($i == $len) :
        if (strlen($$row)) $Where .= " OR (". $$row .")";
        $Where .= ")";
    endif;
endforeach;

Ошибка: Ошибка синтаксического анализа: синтаксическая ошибка, неожиданная ':' , которую он дает в elseif ($ i> 1 && $ i! = $ Len): строка.Я пока не уверен, что это будет делать то, что я хочу, но я не могу попробовать, пока не получу его работу.

$ queryField - это запрос с результатами, как показано ниже, и функция захватывает имена полей изit

Array
(
    [ID] => 3
    [StorageArea] => CAB-1
    [Size] => 
    [Winery] => Name
    [Brand] => Fanciful Name
    [Appellation] => 
    [ReleaseYear] => 2008
    [Varietal] => Cuvée
    [Status] => Library
    [CountryName] => 
)

Благодаря комментариям и ответам, полученным для того, чтобы вышеуказанное сработало, я понял, что это не работает, как я ожидал, поэтому я переосмыслил это и придумал что-то совершенно другое, что работает.Поскольку это не совсем ответ, я публикую его здесь как квази-ответ, и самое интересное было попытаться узнать, сколько раз внутренний цикл был зациклен.К этому есть и другие разделы для Все ключевые слова или Точная фраза , но этот бит очень похож на те, поэтому нет необходимости размещать их все.$ Где объявляется ранее в функции, из которой был извлечен этот код, поэтому здесь он не показан.

Для моего основного вопроса о смешивании условных типов, очевидно, смешивание if и endif с однострочными условными выражениями невозможно ичто {и} рекомендуются для программирования не на основе HTML, но я действительно хотел, чтобы все было одинаково, поэтому для этой версии все однострочные условные выражения внутри циклов foreach, поэтому ошибок нет.

$keywords = explode(" ", trim($keyword));
// Get number of passes for inner loop
// Subtract one because ID column is not being used
$len = ((count(array_keys($queryField))-1) * count($keywords));
$i = - (count($keywords)); // Subtract number of keywords
if (strlen($keyword)) :
    // Any Keywords
    foreach ($keywords as $keyword) :
        $keyword = str_replace("'", "''", trim($keyword));
        foreach (array_keys($queryField) as $column) :
            $i++;
            if ($column === 'ID') continue;
            if (strlen($Where) == 0) $Where .= " WHERE (";
            if ($i != $len) $Where .= "(`$column` LIKE '%" . $keyword . "%') OR ";
            if ($i == $len) $Where .= "(`$column` LIKE '%" . $keyword . "%') ";
        endforeach;
    endforeach;
endif;

1 Ответ

2 голосов
/ 22 марта 2019

Там есть несколько опечаток, но больше всего для того, чтобы это работало, вам придется разбить код следующим образом:

<?php
$i = 1;
$len = count(array_keys($queryField));
?>
<?php
foreach (array_keys($queryField) as $row) :
    $i++;
    if ($row === 'ID') continue;
?>
<?php
    if ($i == 1) :
        if (strlen($Where) == 1) $Where .= " WHERE (";
        $Where .= " (" . $$row . ") ";
        if (strlen($Where) > 1) $Where .= " AND ";
?>
<?php
    elseif ($i > 1 && $i != $len) :
        if (strlen($$row)) $Where .= " OR (". $$row .")";
?>
<?php
    elseif ($i == $len) :
        if (strlen($$row)) $Where .= " OR (". $$row .")";
        $Where .= ")";
?>
<?php
    endif;
endforeach;
?>

К сожалению, невозможно смешивать условные операторы, как показано в вашем коде.

Если этот код не предполагается использовать в шаблоне HTML, я предлагаю придерживаться {} скобок:

$i = 1;
$len = count(array_keys($queryField));
foreach (array_keys($queryField) as $row) {
    $i++;
    if ($row === 'ID') continue;
    if ($i == 1) {
        if (strlen($Where) == 1) $Where .= " WHERE (";
        $Where .= " (" . $$row . ") ";
        if (strlen($Where) > 1) $Where .= " AND ";
    }
    elseif ($i > 1 && $i != $len)
        if (strlen($$row)) $Where .= " OR (". $$row .")";
    elseif ($i == $len) {
        if (strlen($$row)) $Where .= " OR (". $$row .")";
        $Where .= ")";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...