我的代码如下:
<?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语句中?
非常感谢您的回答和建议。
答案 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(并注意适当的变量名称)答案 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()创建的连接标识符。