2017-10-31 2 views
1

PHPアプリケーションをプログラミングしようとしています。このアプリケーションでは、テーブルのIDを取得する必要がありますし、無限に長い時間switch私は次の関数を作るだろうと思った:テーブルが存在していますが、PHPアプリケーションはORA-00903を発生します。

function getId($conn, string $col, string $tbl, string $val): int{ 
    $qry = oci_parse($conn, "SELECT :col FROM :tbl WHERE :col = :val"); 
    oci_bind_by_name($qry, ':tbl', $tbl); 
    oci_bind_by_name($qry, ':col', $col); 
    oci_bind_by_name($qry, ':val', $val); 
    @$success = oci_execute($qry); 

    if($success){ 
    //fetch data 
    }else { 
    $err = oci_error($qry); 
    print_r($err); 
    } 
    } 
} 

私が最初にそれが私の変数をバインドするwouldntはので、それはだと思ったが、私はそれをテストし、それが動作しているようですので、結合trueを返します。私は機能を使用しようとすると、私は次のエラーメッセージが出ます:

Array 
(
    [code] => 903 
    [message] => ORA-00903: Invalid table name 
    [offset] => 20 
    [sqltext] => SELECT :col FROM HR.:tbl WHERE :col = :val; 
) 

を私はすでにいくつかの記事を読んで、私はまだ私のエラーを見つける傾けます。あなたが私を助けることを願っています。

+0

これは他の答えに記載されているようには機能しません。バインド変数はSQLテキストではなくデータのためのものです。文字列連結を使用してPHP内でSQLテキストを動的に構築する場合は、SQLインジェクション攻撃につながるので、ユーザーから渡された値を連結しないでください。そのようなテキストがスクリプトでハードコードされていることを確認してください。 –

答えて

1

私が知る限り、準備されたステートメントでテーブル名とカラム名をバインドすることはできません。これは実際にはプリペアドステートメントの制限ではありません。なぜなら、一般的に列とテーブルの構造が異なるテーブル間で異なるため、同じステートメントを再利用することができないからです。

だから私は、次のように動作することを期待:

$qry = oci_parse($conn, "SELECT some_col FROM your_table WHERE some_col = :val"); 
oci_bind_by_name($qry, ':val', $val); 
@$success = oci_execute($qry); 

は、内部的には、私もここで実際に何が起こっているのかわからないが、一つの可能​​性は、PHPをパラメータとして、あなたのテーブル名をエスケープしていることです。いずれにせよ、それは実行されるクエリにつながりません。

プリペアドステートメントで列またはテーブルを変更する必要がある場合は、別のステートメントを作成してください。

+1

投票についてではなく、質問/回答を明確にするためにコメントを残しておきましょう。 –

関連する問題