postgresql混合大小写表名的PHP语法

时间:2010-05-13 06:20:48

标签: php postgresql

我的代码如下:

<?php
require "institution.php"
/* in this portion, query for database connection is executed, and  */

$institution= $_POST['institutionname'];

$sCampID =  'SELECT ins_id FROM institution where ins_name= '$institution' ';
$qcampID = pg_query($sCampID) or die("Error in query: $query." . pg_last_error($connection));
/* this portion outputs the ins_id */           
?>

之前我的数据库没有混合大小写的表名,这就是为什么当我运行这个查询时,它根本没有显示任何错误。但是因为我出于某种原因改变了我的数据库,并且它现在包含混合大小写的表名,所以我必须将上面的代码更改为这个:

$sCampID =  'SELECT ins_id FROM "Institution" where ins_name= '$institution' ';

该机构必须加双引号。查询返回解析错误。  当我删除这部分:ins_name ='$ institution'时,没有发生错误。

我的问题是如何解决这个问题,其中包含一个混合大小写字母的表名和一个存储在一个变量中的值(本例中为$ institution)将组合在一个select语句中?

非常感谢您的回答和建议。

5 个答案:

答案 0 :(得分:1)

您可以使用双引号

$sCampID =  "SELECT ins_id FROM \"Institution\" where ins_name= '$institution'";

答案 1 :(得分:1)

<?php
require "institution.php"
/* in this portion, query for database connection is executed, and  */

$institution= pg_escape_string($_POST['institutionname']);

$sQuery =  "SELECT ins_id FROM \"Institution\" where ins_name= '$institution'";
$qcampID = pg_query($sQuery) 
  or trigger_error("Error in query: $sQuery." . pg_last_error($connection));
/* this portion outputs the ins_id */           
?>

注意

  • pg_escape_string因为它应该被使用,不是为了防止任何注入,而是作为语法的一部分。
  • 应该使用
  • trigger_error代替echo(并注意适当的变量名称)
  • 双引号或您的变量不会外推(http://php.net/types.string代表参考)
  • 和双引号斜杠(同样的参考)

答案 2 :(得分:0)

$sCampID =  'SELECT ins_id FROM "Institution" where ins_name= \''.$institution.'\'';

字符串转义。

正如另一位评论者发布的那样,请阅读有关SQL注入的内容。我所拥有的不是注射安全,考虑使用准备好的语句,最好是PDO。

答案 3 :(得分:0)

要添加其他答案(引用表名,并使用预准备语句来获得安全性和性能),请阅读PG and tables case sensitivity。如果您有该选项,则可以考虑更改数据库模式,以便表名(以及通常的列和标识符)都是小写的。这会简化您的查询 - (但要求您检查所有实际引用的查询并取消引用它们)。

答案 4 :(得分:0)

如果$ institution包含以下字符串会发生什么:'或1 = 1; -

这就是我们所说的SQL注入攻击,这对于黑客窃取您的数据来说是一种非常简单的方法 - 并让您的客户遇到大麻烦。

在将字符串放入SQL查询之前,需要使用pg_escape_string()来转义该字符串。我喜欢使用sprintf()来构建我的查询:

$sql = sprintf("SELECT ins_id FROM \"Institution\" where ins_name= '%s'", pg_escape_string($conn, $institution));

在上面的例子中,$ conn是通过调用pg_connect()创建的连接标识符。