PHP中的基本SQL Select语句格式

时间:2011-03-13 17:23:05

标签: php mysql prepared-statement

我有一个可搜索的众议院和参议院数据库,我只想制作一个可以搜索这个数据库的简单网页。唯一的问题是,虽然我很乐意编写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
    }
}

5 个答案:

答案 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')";