私はプログラミングの初心者で、手続き型の 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 とスプリント) に危険はありますか?