我试图用一个具有硬编码字段名的代码替换为一个从查询中动态获取字段名的代码,并使其大部分工作,但一直到某个程度,然后出现错误。这是我试图用创建WHERE子句的字段名的foreach循环替换的代码:
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 else,它同时使用单行条件和更常规的if elseif语句,它们使用:和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是一个查询,结果如下,该函数从中获取字段名称
Array
(
[ID] => 3
[StorageArea] => CAB-1
[Size] =>
[Winery] => Name
[Brand] => Fanciful Name
[Appellation] =>
[ReleaseYear] => 2008
[Varietal] => Cuvée
[Status] => Library
[CountryName] =>
)
感谢收到的评论和答复以使上述工作有效,我意识到它没有达到我的预期,因此我重新考虑一下,并提出了完全不同的建议。由于这不是一个确切的答案,因此我将其作为准答案发布在这里,而有趣的部分是试图了解内部foreach循环了多少次。对于所有关键字或精确短语,还有其他部分,但是此位与那些关键词非常相似,因此无需发布所有关键词。 $ Where是在提取此代码的函数中声明的较早位置,因此此处未显示。
对于我的关于混合条件类型的基本问题,显然不可能将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;
答案 0 :(得分:2)
那里有一些错别字,但要使它正常工作,最重要的是您必须像下面这样破坏代码:
<?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 .= ")";
}
}