1

私はこのコードをPHPで使用しており、データベースとしてPostgreSQLを使用しています。GETからすべてのパラメーターを取得しています。印刷して確認しました。形成されたクエリはPostgresターミナルで実行されますが、PHPスクリプトでは失敗します。

これがコードです。

<?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個のフィールドが更新されています。

何が悪いのか聞いてください。助けに感謝します!

4

2 に答える 2

5

addslashesPostgreSQL の文字列を引用するために使用するべきではありません。使用する必要がありますpg_escape_literal

pg_escape_literal()は、PostgreSQL データベースに問い合わせるためのリテラルをエスケープします。エスケープされたリテラルを PostgreSQL 形式で返します。pg_escape_literal()は、データの前後に引用符を追加します。の代わりに、この関数の使用をお勧めしpg_escape_string()ます。

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

DBMS 固有のエスケープ関数を使用することを強くお勧めします ( mysqli_real_escape_string()MySQL やpg_escape_string()PostgreSQL など)。

あなたはこれをしているはずです:

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

idそれも実際の数字だと思います。

于 2012-04-19T21:20:17.810 に答える
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 (引用符なし) を使用することをお勧めします

于 2012-04-19T21:17:13.500 に答える