PHP和报价

时间:2010-08-18 09:11:26

标签: php mysql

我总是不确定,我发现自己经常玩弄它。

这是正确的吗?

$game_name = "poker"; (Included from Config.php)
$game_name_lower = strtolower($game_name);
$sql = "SELECT * FROM `winners` WHERE `game` = '$game_name_lower'";

5 个答案:

答案 0 :(得分:2)

是的,看起来很好。但是,您可能需要考虑使用预准备语句。引用PHP Manual on the topic

  

准备好的陈述有两个主要好处:

     
      
  • 查询只需要解析(或准备)一次,但可以使用相同或不同的参数执行多次。准备好查询后,数据库将分析,编译和优化它的执行查询的计划。对于复杂查询,如果需要使用不同的参数多次重复相同的查询,则此过程可能会占用足够的时间,从而显着减慢应用程序的速度。通过使用预准备语句,应用程序避免重复分析/编译/优化循环。这意味着预准备语句使用的资源更少,因此运行速度更快。

  •   
  • 不需要引用准备语句的参数;驱动程序自动处理这个。如果应用程序专门使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果使用非转义输入构建查询的其他部分,仍然可以进行SQL注入)。

  •   

答案 1 :(得分:1)

如果不看周围的代码,就不可能说出来。如果$game_name_lower直接来自用户输入,那么肯定不是。否则引用就好了,如果没有必要的话。

答案 2 :(得分:1)

实际上这里的PHP报价很少 只有周围的"属于PHP 剩下的就是mysql的事情。

  • 反引号用于分隔标识符 - 表名和列名
  • 单引号(或双引号)用于分隔字符串。由于这些分隔符和一些其他条件,应正确转义字符串内容。虽然还有另一种方法可以将字符串(以及其他类型的数据)传递给数据库 - 上面提到的语句。

答案 3 :(得分:0)

没关系,如果它被正确转义了。

答案 4 :(得分:-1)

应该是这样的,你不需要'围绕表名或列名。

$dbc = mysql connection;
$q = "SELECT * FROM winners WHERE game = '$game_name_lower'";
$r = @mysqli_query($dbc, $q);