我是编程的新手,只知道程序化的PHP。我一直在研究准备好的陈述和其他安全问题。我对下面的代码有几个问题:
我有一张鞋尺码表,尺码和尺码相同(例如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和sprint)?
答案 0 :(得分: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
不需要 。
htmlspecialchars
用于在网页上显示HTML字符,它会使它们脱离,因此浏览器无法解析它们。