我是编程新手,只知道程序 PHP。我一直在研究准备好的陈述和其他安全问题。我对下面的代码有几个问题:
我有一张鞋类尺码表,它们的尺码和 sizeid 相同(例如,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);
这没用。不是“隐藏”变量的想法吗?
mysqli_real_escape_string
3.和htmlspecialchars
在一起好吗?如果不是为什么,如果没关系,是否应该在另一个之前叫出一个,如果这有什么不同吗?
4. 我需要将尺码输出为浮点数,因为现实世界的鞋码是这样的(即 7.5、9.5 等)。我选择这样做的方法(floatval 和 sprint)有什么危险吗?