1

私はプログラミングの初心者で、手続き型の PHP しか知りません。私は準備された声明やその他の安全性の問題を研究してきました. 以下のコードについていくつか質問があります。

サイズとサイズ ID が同じフットウェア サイズのテーブルがあります (例: SIZE: 9.5 = sizeID: また 9.5)。

処理ファイルをチェックして、前の HTML フォーム ページから選択したサイズを取得します。

<?php
$link = mysqli_connect("servert", "user", "passW", "footwear");
        if(!$link){
            printf("Can't connect to the locatlhost. Errorcode: %d\n", mysqli_connect_errno());
        }
if (!mysqli_select_db($link, "footwear")) {
   printf("Can't connect to Database. Errorcode: %d\n", mysqli_connect_errno());
}      
$stmt = mysqli_stmt_init($link);
if($stmt=mysqli_prepare($link,"SELECT `sizeid`,`size` FROM `size` WHERE `sizeid`"))
{
mysqli_stmt_bind_param($stmt,"i", $sizeid);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$sizeid, $size);
mysqli_stmt_fetch($stmt);
        if(!floatval($size)) {
        echo "Invalid size. Pick another one.";
        }
        else {          
        $size = mysqli_real_escape_string($link, $size);
        $sizeid= mysqli_real_escape_string($link, $sizeid);

        $size= htmlspecialchars($size, ENT_QUOTES, 'UTF-8');
        $sizeid= htmlspecialchars($sizeid, ENT_QUOTES, 'UTF-8'); 

        $size = sprintf('%01.1f', $size);
        $sizeid = sprintf('%01.1f', $sizeid);

echo " Size: $size";
}
}
?>

コードは機能しますが、それがどのように機能するかをよりよく理解したいです。

1. この行 (私は PHP.NET に従いました) は必要/重要ですか?:

$stmt = mysqli_stmt_init($link);

どうやら、コードを省略してクエリに直接移動すると、コードは正常に機能するようです。

$stmt=mysqli_prepare($link,"SELECT `sizeid`,`size` FROM `size` WHERE `sizeid`");

2. 私が読んだことから、私の理解では、疑問符 (?) がプレースホルダーとして使用され、それが mysqli_stmt_bind_param にバインドされます。しかし、私がしようとすると

if($stmt=mysqli_prepare($link,"SELECT `sizeid`,`size` FROM `size` WHERE `?`"))…
mysqli_stmt_bind_param($stmt,"i", $sizeid);

それは動作しません。変数を「隠す」という考えではありませんか?

3.一緒にいるmysqli_real_escape_stringのは大丈夫ですか、それとも痛いですか。htmlspecialcharsそうでない場合、問題がなければ、一方を他方よりも先に呼び出す必要がありますか?

4. 実際の靴のサイズは 7.5 や 9.5 などなので、フロートとして出力するサイズが必要です。私が選択した方法 (floatval とスプリント) に危険はありますか?

4

1 に答える 1

2

mysqli_stmt_init準備済みステートメント オブジェクトを作成します。 mysqli_prepareそれにクエリを割り当てます。に渡すことになっている は、に置き換える値を渡すために使用され$stmtますmysqli_prepare mysqli_stmt_bind_param?

$stmt = mysqli_stmt_init($link);
// $prepared will be a boolean
// the `?` are just for the values you want to pass
$prepared = mysqli_prepare($stmt, "SELECT `sizeid`,`size` FROM `size` WHERE `sizeid` = ?");

if($prepared){
    // Replace the `?` with a value in the WHERE clause
    mysqli_stmt_bind_param($stmt, "i", $sizeid);

    // run the query
    mysqli_stmt_execute($stmt);

    // assign result variables
    mysqli_stmt_bind_result($stmt, $result_sizeid, $result_size);

    // get results
    mysqli_stmt_fetch($stmt);

    echo htmlspecialchars("The sizeid is $result_sizeid and the size is $result_size");

    // close prepared statement
    mysqli_stmt_close($stmt);
}
else{
    die(mysqli_errno($link));
}

mysqli_close($link);

PHP ドキュメント: http://www.php.net/manual/en/mysqli-stmt.prepare.php

mysqli_real_escape_stringデータベースに挿入する前に値をエスケープするためにのみ使用されますあなたの準備されたステートメントはあなたのためにこれを行うので、ここでmysqli_real_escape_stringまったく必要ありません。

htmlspecialcharsWeb ページに HTML 文字を表示するために使用され、ブラウザによって解析されないようにエスケープします。

于 2013-02-04T18:51:00.653 に答える