2010-07-28 2 views
0

Так что я делаю поиск, и я использую implode в моем select statement, который я считаю весьма полезным. В основном у этой поисковой системы будет 3 разных выбора, которые будут выбирать разные вещи, основываясь на разных критериях, и когда я использую мой implode, я получаю ошибку с недопустимыми аргументами.php implode question

Вот мое заявление SQL:

 
$sql = "SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link FROM ((camp INNER JOIN gender ON camp.id = gender.camp_id) 
INNER JOIN grades ON camp.id = grades.camp_id) 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE ((grades.year = '".implode('\' OR grades.year = \'',$age)."') 
AND gender.gender = '".$gender."') 
OR ((interests.activity = '".implode('\' OR interests.activity = \'',$array)."') 
AND (grades.year = '".$age."' AND gender.gender = '".$gender."'))";

Второй Implode интересов, где я начал иметь свою проблему и $ массив является массивом. Еще одна вещь, которую я не понимаю, заключается в том, что когда я запускаю свой код, я получаю правильные результаты, но я все еще получаю сообщение об ошибке, когда передаю недопустимые аргументы.

+0

Так что я должен быть абсолютно заторможенным, потому что, когда я пошел искать код для публикации, я понял, что я просто перепутал большое время и не понял, что мой код вышел из строя, и это была моя проблема. Извините за эту тему за простой ответ. Спасибо, ребята, которые помогли, хотя это очень ценится! – Chris

ответ

0

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

0

Крис, ваша проблема в том, что вы не пропускания массива ко второму параметру Implode().

Если вы видите www.php.net/implode второй параметр должен быть типа ARRAY так, что PHP может начать присоединение ваш массив вместе с разделителем указанный в первом параметре.

Хороший способ проверить тип данных переменной является использование var_dump(), который будет сообщать вам, если что-то является массивом, или int..etc

Есть две переменные вы передаете в implode() есть. $ Возраст и $ array, я предполагаю, что это возраст, и вам нужно немного изменить свой код.

Вставка всего кода, который генерирует $ array и $ age, поможет нам узнать, где вы ошибаетесь при создании этих переменных.

Надеюсь, это поможет.

2

Вы можете поверить, что PHP говорит, как правило. Если он говорит, что это не массив, вы, вероятно, не передали массив.

И небольшой совет, чтобы спасти вас код: Существует IN() заявление в MySQL:

$sql = "SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link FROM ((camp INNER JOIN gender ON camp.id = gender.camp_id) 
INNER JOIN grades ON camp.id = grades.camp_id) 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE (grades.year IN(".implode(',', $age).") 
AND gender.gender = '".$gender."') 
OR (interests.activity IN('".implode("','", $array)."') 
AND grades.year = ".$age." AND gender.gender = '".$gender."')"; 

Чтобы сохранить дубликат gender.gender = $gender и (возможно) оптимизировать запрос:

$sql = "SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link FROM ((camp INNER JOIN gender ON camp.id = gender.camp_id) 
INNER JOIN grades ON camp.id = grades.camp_id) 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE gender.gender = '".$gender."' 
AND (
    grades.year IN(".implode(',', $age).") 
    OR (
     interests.activity IN('".implode("','", $array)."') 
     AND grades.year = ".$age." 
    ) 
)"; 

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

$sql = 
"SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link 
FROM camp 
INNER JOIN gender ON camp.id = gender.camp_id 
INNER JOIN grades ON camp.id = grades.camp_id 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE gender.gender = '".$gender."' 
AND (
    grades.year IN(".implode(',', $age).") 
    OR (
     interests.activity IN('".implode("','", $array)."') 
     AND grades.year = ".$age." 
    ) 
)"; 

Теперь запрос лучше понять.

+0

Ваши права MySQL не требует скобок, но я разработал это для использования Access DB, но теперь я пытаюсь заставить его работать с MySQL. Также это решение не сработало. – Chris

0

Поскольку вы используете строки:

OR (interests.activity IN ('".implode("','", $array)."') 

будет обметать на эту строку.

Но я беспокоюсь о возрасте в возрасте.Вы можете использовать его, как будто это массив в:

WHERE ((grades.year = '".implode('\' OR grades.year = \'',$age)."') 

, но в качестве переменной строки:

AND (grades.year = '".$age."' AND gender.gender = '".$gender."'))"; 

Я думаю, что вы должны использовать «IN» и взрываться() выражения для обоих местах вы '$ using $ age, если это массив.