2012-04-19 14 views
1

私はこのコードをPHPでデータベースとしてPostgreSQLを使用しています。私はGETからすべてのパラメータを取得しています。印刷してチェックしてください。作成されたクエリはPostgres端末で実行されますが、PHPスクリプトからは失敗します。update query php postgresが何の理由もなく失敗しました

ここにコードがあります。

<?php 

$link = pg_connect("host=localhost dbname=postgres user=postgres password=password") or die('connection failed'); 

# Building the query 
$newq=sprintf("update purchase_info set ....... comments=%s where id=%s",......,$comm,$id); 

    print $newq; // This query runs on the postgres terminal 
    $query=addslashes($newq); // to escape "" as one of my fields is comments 
    $result=pg_query($link,$newq); 

    if (!$result) { 
     echo "An error occured.\n"; 
    } 
    pg_close($link); 
?> 

他のクエリは同じスクリプトで実行されます。このSQLステートメントには、約14フィールドが更新されています。

何が間違っているか聞いています。 ヘルプをよろしくお願いします。

+0

「理由なし」に何も失敗しません。 – Brad

答えて

5

あなたがpg_escape_literalを使用する必要があり、PostgreSQLの文字列を引用するaddslashesを使用すべきではありません。

pg_escape_literal()は、PostgreSQLデータベースを照会するためのリテラルをエスケープします。エスケープされたリテラルをPostgreSQL形式で返します。 pg_escape_literal()は、データの前後に引用符を追加します。 pg_escape_string()の代わりにこの機能の使用を推奨します。

あなたは、データベースの文字列を引用するためにaddslashesを使用しないでください:

非常にDBMS固有のエスケープ関数(PostgreSQLの例MySQLのmysqli_real_escape_string()またはpg_escape_string()

あなたを使用することをお勧めしますこれを行う必要があります:

$newq = sprintf("update purchase_info set ... comments=%s where id=%d", ..., pg_escape_literal($comm), $id); 

私はidが実際には数字であると仮定しています。

+0

- わかりました。大きなありがとう! –

+0

@HiteshDharmadasani:私は、準備文、プレースホルダ、およびPDOを調べて、自分自身で引用することについて心配する必要がないようにすることをお勧めします。 –

+1

pg_escape_literal()は、リリースされたphp(5.4.0が最新のもの)でまだ利用できません。それはほとんどの人にとっては問題になるでしょう! –

4

あなたが本当にSQLクエリにパラメータを注入したいと仮定すると、正しいコードは次のようになります。

$newq=sprintf("update purchase_info set ... comments='%s' where id='%s'", 
    pg_escape_string($comm), pg_escape_string($id)); 
// DO NOT USE to addslashes, it is not correct 
$result=pg_query($link, $newq); 

お知らせフォーマット文字列内の%sを囲む単一引用符。 idが整数の場合 はまた、代わりに「%s」が使用さ%dを(引用符なし)を行う方が良いでしょう

+0

すべてのセキュリティが離れています。 このようなSQLクエリを作成します $ newq = "update purchase_info ... comments = '"。$ comm。 "' id = '"。$ id。 "'"; も機能しますか? –

+1

ほとんどの場合、 'id'を引用してはいけません.PostgreSQLは数字を数字にすることを望んでいます。 –

+1

実際、PostgreSQLは、リテラルを解決するまで、一重引用符で囲まれたリテラルを "不明"タイプとして扱います。他の情報がなければ、それはテキストに解決されますが、通常、* any *型の代入ではシングルクォートリテラルを使用できます。これは、グローバル座標のようなカスタムデータ型を、リテラルから明示的にキャストする必要なしに、リテラルから割り当てられた値を持つファーストクラスのオブジェクトとして扱うことができるように行われます。 – kgrittn

関連する問題