所以我正在进行搜索,我在select语句中使用了一个内爆,我发现它非常有用。基本上这个搜索引擎将有3个不同的选择,它们将根据不同的标准选择不同的东西,当我使用我的内爆时,我得到了传递无效参数的错误。
这是我的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."'))";
感兴趣的第二个内容是我开始遇到问题而$ array是一个数组。另一件我不明白的是,当我运行我的代码时,我得到了正确的结果,但我仍然得到错误,我传递了无效的参数。
答案 0 :(得分:2)
你可能会相信PHP所说的。如果它说它不是一个数组,你可能没有传递数组。
还有一个小技巧可以保存一些代码:MySQL中有一个IN()
语句:
$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."
)
)";
现在查询应该更好理解。
答案 1 :(得分:0)
你正试图在大声明中做所有事情。为什么不在将它们包含在SQL中之前构建内爆的数组字符串?
答案 2 :(得分:0)
Chris,你的问题是你不将数组传递给implode()的第二个参数。
如果您看到 www.php.net/implode ,则第二个参数必须是 ARRAY 类型,以便PHP可以与您的分隔符一起开始加入您的阵列在第一个参数中指定。
检查变量数据类型的一个好方法是使用var_dump()来告诉你某些东西是数组,还是int..etc
您有两个变量传递给 implode()。 $ age 和 $ array ,我猜它已经过了年龄,你需要修改一下你的代码。
粘贴生成$ array和$ age的整个代码将有助于我们进一步了解在创建这些变量时出错的地方。
希望这有帮助。
答案 3 :(得分:0)
由于您使用的是字符串:
OR (interests.activity IN ('".implode("','", $array)."')
会阻止那条线。
但我担心年龄。您可以像使用它一样使用它:
WHERE ((grades.year = '".implode('\' OR grades.year = \'',$age)."')
但作为字符串变量:
AND (grades.year = '".$age."' AND gender.gender = '".$gender."'))";
我认为你应该在你使用$ age的地方使用“IN”和implode()表达式,如果它是一个数组。