3

私はPHPは初めてですが、プログラミングはしていません。ASP [クラシック] のバックグラウンドから来ました。簡単に言えば、IIS7 と SQL Server 2005 Express で FastCGI を使用して、PHP 5.4 を使用しています。私は基礎を学び、かなりの時間をセキュリティの調査に費やしました。

GET と POST の両方の入力データをサニタイズしています。私のデータベース接続文字列は、Web ルートの外にある別のファイルにあります。私は PDO プリペアド ステートメントを使用しています [クエリ + 引用符の方が速く実行されると聞きましたが]、名前付きプレースホルダーと db ストアド プロシージャを使用しています。

bindParam 関数内で追加の引数を使用する必要がある理由、特にデータ型オプション「PDO::PARAM_STR, 12」を使用する必要がある理由を理解しようとしています [その例の 2 番目の引数はデータの長さを表していますか?]。

bindParam 内でデータ型と長さを指定する利点は何ですか? データ型と長さが既に指定されているストアド プロシージャを使用している場合、必要ですか? また、ストアド プロシージャから値を返すには、「PDO::PARAM_INPUT_OUTPUT」のようなものを使用する必要があると思いますか?

ありがとう!

** 編集 **
何らかの理由で、PDO::PARAM_STR 引数を使用すると、ストアド プロシージャがデータベースにデータを書き込まないように見えます。だからその説は割愛した。これが私のコードです:

$sql1 = $conn->prepare("EXEC insert_platts :userAgent, :userIp, 1, :source");
$sql1->bindParam(':userAgent', $userAgent);
$sql1->bindParam(':userIp', $userIp);
$sql1->bindParam(':source', $source);
$sql1->execute();

また、ストアド プロシージャから ID 値を返すのではなく、代わりに lastInsertId() を使用しています。

$lastRow = $conn->lastInsertId();
print $lastRow;
4

1 に答える 1

0

いいえ、データ型とデータ長は必要ありません。私は mysql ストアド プロシージャを使用しており、パラメーターは型指定された値ではありませんが、もちろん検証しています。その理由は、余分なセキュリティと INOUT パラメータだと思います。見積もり:

ストアド プロシージャから INOUT パラメータを返すには、ビットごとの OR 演算子を使用して PDO::PARAM_INPUT_OUTPUT を設定します。

これを試しましたか?

$params = array(
            ':userAgent'=>$userAgent,
            ':userIp' => $userIp,
            ':source' => $source
          );
$sql1 = $conn->prepare("EXEC insert_platts :userAgent, :userIp, 1, :source");
$sql1->execute($params);

特殊文字について: 正しいエンコーディングを使用していますか? つまり、php アプリと DB で同じエンコーディングを使用すると... スクリプト内の 1 つのエンコーディングとデータベース内の別のエンコーディングで作業するのが難しい場合があります..そして、そのような問題が頻繁に発生します...

于 2013-03-24T20:02:26.050 に答える