php
  • postgresql
  • 2010-05-13 104 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()創建。

    相關問題