我有一个可搜索的众议院和参议院数据库,我只想制作一个可以搜索这个数据库的简单网页。唯一的问题是,虽然我很乐意编写SQL select语句,但如何正确格式化它们以便在PHP中使用?
例如,这是我的单选按钮,按州选择参议员:
$sql = "";
if ($_POST['pkChamber'] == "Senate") {
if ($_POST['pkParty'] == "Y") {
$sql = SELECT * FROM senateinfo
WHERE state = (Variable = "stname")
ORDER BY last_name, first_name');
}
else
{
$sql = SELECT * FROM senateinfo
WHERE state = (Variable = "stname")
ORDER BY last_name, first_name
}
}
答案 0 :(得分:3)
我不确定你要求的是什么,但我有一个很好的例子,可靠而安全地动态构建WHERE语句:
$w = array();
$where = '';
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";
if (count($w)) $where = "WHERE ".implode(' AND ',$w);
$query = "select * from table $where";
希望这有帮助。
答案 1 :(得分:2)
您的查询似乎很好。我想你只需要理解PHP中字符串解析的一些细节。
当你使用双引号(“)括起一个字符串时,PHP实际上会尝试解析它,寻找变量和/或其他PHP代码来处理。像这样:
$sql = "SELECT * FROM table WHERE state = '{$state}' AND user = {$user->id}";
PHP会将$ state替换为该变量中定义的任何内容,并且对于该类中实例化的任何用户的id都是相同的。 (另外,你不必在{}中包装你的简单变量。它确实有助于提高可读性,但只有类方法/变量才需要。)
如果使用单引号(')来包含字符串,PHP只会像平常那样对待它。对于您的上述查询,我建议将其括在单引号中,如下所示:
$sql = 'SELECT * FROM senateinfo WHERE state = (Variable = "stname") ORDER BY last_name, first_name)';
如果您希望稍后在此查询中使用变量,则需要转义其中的双引号,如下所示:
$sql = "SELECT * FROM senateinfo WHERE state = (Variable = \"stname\") ORDER BY last_name, first_name)";
这样,当你所做的只是粘贴一个查询时,PHP并没有错误地认为你试图连接错误的字符串。
答案 2 :(得分:1)
我使用HEREDOC来写出非平凡的查询:
$sql = <<<EOL
SELECT blah, blah, blah
FROM table
WHERE (somefield = {$escaped_value}) ...
ORDER BY ...
HAVING ...
EOL;
Heredocs的功能就好像你已经完成了一个普通的双引号字符串,但是没有逃避内部引号的奖励。变量插值按预期工作,您也可以对文本进行缩进,因此您的查询看起来格式正确
答案 3 :(得分:1)
您需要一次关注一个问题。
尝试避免在PHP中编写SQL,直到您对PHP中的字符串有清晰的处理,以及如何将变量注入到这些字符串中。所以:
阅读PHP中的字符串引用(双引号与单引号,是的,HEREDOC)
阅读PHP中字符串中的变量(请注意,如果它没有$美元符号,那么它是一个CONSTANT,而不是一个字符串变量。用$ strings和$ variables开始吧#39;应该使用,而不是CONSTANT,只有在没有其他可用的情况下才会变成字符串。)
阅读PHP中的绑定SQL。其他任何事情都会引领你走上SQL injection的道路。如果您的PHP SQL中只使用了裸字符串,那么当您最终将Web脚本部署到恶劣且无法容忍的Internet时,您就会为自己设置失败。它充满了鲨鱼,准备好利用易于SQL注入的脚本。
以下是我每天用来绑定SQL的代码示例,以自定义函数为中心,使其变得简单:
query("select * where someTable where someTable_id = :bound_id", array(':bound_id'=>13));
如果您对此感兴趣,我可以为您创建一个创建绑定SQL的函数(就像我实际上是在计算机而不是移动设备上)。
答案 4 :(得分:0)
我总是这样做,以保持它看起来不错。
$sql = "SELECT * FROM senateinfo " .
"WHERE state = (Variable = "stname") " .
"ORDER BY last_name, first_name')";