Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный T_IF

$query = "SELECT a.*, cc.name AS category, dd.ezcity AS proploc, ee.name AS statename, ff.name AS cnname, ss.dealer_name AS propseller, u.name AS editor"

. "\n FROM #__ezrealty AS a"

. "\n LEFT JOIN #__ezrealty_catg AS cc ON cc.id = a.cid"

. "\n LEFT JOIN #__ezrealty_locality AS dd ON dd.id = a.locid"

. "\n LEFT JOIN #__ezrealty_state AS ee ON ee.id = a.stid"

. "\n LEFT JOIN #__ezrealty_country AS ff ON ff.id = a.cnid"

. "\n LEFT JOIN #__ezrealty_profile AS ss ON ss.mid = a.owner"

. "\n LEFT JOIN #__users AS u ON u.id = a.checked_out"

. ( count( $where ) ? "\n WHERE " . implode( ' AND ', $where ) : "")

. if ( isset ($_POST['idSearch']) ) 

    . { " WHERE a.id = " . $_POST['idSearch']  ; }

. "\n ORDER BY ". $order

. "\n LIMIT $pageNav->limitstart, $pageNav->limit"

;

я не понимаю здесь неправильный синтаксис :( ,, и он продолжает возвращать ту же ошибку, неожиданную T_IF


person omnia Mm    schedule 21.12.2011    source источник
comment
. (!empty($_POST['idSearch']) ? " WHERE a.id = " . $_POST['idSearch'] : "\n ORDER BY ". $order ."\n LIMIT $pageNav->limitstart, $pageNav->limit"); Это правильное решение для поиска на всех страницах, а не только на отображаемой.   -  person omnia Mm    schedule 22.12.2011


Ответы (4)


if может быть только оператором: вы используете его как выражение. Он ничего не возвращает и не может использоваться в другом операторе.

Однако вы можете использовать тернарный оператор, чтобы сделать именно это:

. ( isset ($_POST['idSearch']) ?  " WHERE a.id = " . $_POST['idSearch'] : '') 

Это говорит: «Если установлено $_POST['idSearch'], добавьте эту строку, в противном случае добавьте пустую строку.

Обратите внимание, что вы действительно должны смотреть на свой код, потому что есть вопиющая SQL-инъекция только в том коде, который я разместил выше. Любой может выполнить произвольный код в вашей базе данных. Не забудьте дезинфицировать вводимые данные и, желательно, использовать подготовленные операторы и параметризованные запросы, чтобы сделать код более безопасным.

person lonesomeday    schedule 21.12.2011
comment
SQL=SELECT a.*, cc.name КАК категория, dd.ezcity КАК proploc, ee.name КАК statename, ff.name КАК cnname, ss.dealer_name КАК propseller, u.name КАК редактор ИЗ jos_ezrealty КАК ЛЕВОЕ СОЕДИНЕНИЕ jos_ezrealty_catg КАК cc ON cc.id = a.cid ЛЕВОЕ СОЕДИНЕНИЕ jos_ezrealty_locality AS dd ON dd.id = a.locid ЛЕВОЕ СОЕДИНЕНИЕ jos_ezrealty_state AS ee ON ee.id = a.stid ЛЕВОЕ СОЕДИНЕНИЕ jos_ezrealty_country AS ff ON ff.id = a.cnid ЛЕВОЕ СОЕДИНЕНИЕ jos_ezrealty_profile AS ss ON ss.mid = a.owner LEFT JOIN jos_users AS u ON u.id = a.checked_out WHERE a.id = ORDER BY a.id DESC LIMIT 0, 5 - person omnia Mm; 21.12.2011
comment
Я не совсем уверен, как я должен это отлаживать, но я предполагаю, что $_POST['idSearch'] установлен, но пуст. Я могу ошибаться. Вы не очень подробно рассказываете... - person lonesomeday; 21.12.2011
comment
он пуст, предполагается, что если он пуст, ничего не делайте и извлекайте все данные, а не конкретный, я думаю, что получу сообщение по гиперссылке и строке запроса :), спасибо всем - person omnia Mm; 21.12.2011

Удалить . (точка) перед оператором if. Поскольку оператор if сам по себе не является строкой, вы не можете просто объединить его.

person Alex van den Hoogen    schedule 21.12.2011

Не делайте этого:

. if (condition) { value_if_true; }

Вместо этого сделайте следующее:

. (condition ? value_if_true : value_if_false)
person Alex Howansky    schedule 21.12.2011

Я полагаю, вы хотите превратить это в злой тернарный оператор:

. (count ...)
. (isset($_POST['idSearch']) ? ' WHERE a.id = ' . $_POST['idSearch'] : '')
. "\n ORDER BY" ...
person Explosion Pills    schedule 21.12.2011
comment
Почему тернарный оператор злой? - person Rocket Hazmat; 21.12.2011
comment
@Rocket Я так не думаю, но есть много разработчиков, которые это делают. Одним из примеров проблемы является то, что вы не можете добавлять операции к условию постфактум. - person Explosion Pills; 21.12.2011