php内爆问题

时间:2010-07-28 21:15:43

标签: php

所以我正在进行搜索,我在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是一个数组。另一件我不明白的是,当我运行我的代码时,我得到了正确的结果,但我仍然得到错误,我传递了无效的参数。

4 个答案:

答案 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()表达式,如果它是一个数组。