php
  • postgresql
  • 2010-05-13 51 views 1 likes 
    1

    我有以下代码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 ='$院校',没有发生错误。

    我的问题是我该如何解决这个问题,其中包含混合大小写字母和值存储在一个变量(在这种情况下,$机构)表名称将在一个select语句进行组合?

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

    +0

    我建议您先阅读http://php.net/manual/en/security.database.sql-injection.php - 它也可能解决您的问题。 – Artefacto 2010-05-13 06:23:45

    +0

    好的,非常感谢你。我明白了。 – yam 2010-05-15 07:12:52

    回答

    1

    您可以使用双引号代替

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

    不错的编辑。现在它会:) – 2010-05-13 06:43:37

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

    字符串逃脱。

    作为另一位评论者张贴,阅读有关SQL注入。我拥有的不是注射安全的,考虑使用准备好的陈述,最好是PDO。

    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应该被用来代替回声(并注意适当的变量名)
    • 双引号或您的变量将不会被推断(http://php.net/types.string为参考)
    • 和双引号斜杠(同裁判)
    +0

    谢谢..谢谢! – yam 2010-05-15 07:11:42

    0

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

    0

    如果$ institution包含以下字符串,会发生什么情况:'or 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()创建。

    相关问题