Php 理解编写的声明;mysqli\u real\u escape\u字符串和htmlspecialchars
我是一个编程新手,只懂程序PHP。我一直在研究准备好的声明和其他安全问题。我对下面的代码有几个问题: 我有一张尺寸和尺码相同的鞋类尺码表(例如,尺码:9.5=尺码:也可以是9.5) 我的处理文件检查,然后从上一个html表单页面检索所选大小Php 理解编写的声明;mysqli\u real\u escape\u字符串和htmlspecialchars,php,Php,我是一个编程新手,只懂程序PHP。我一直在研究准备好的声明和其他安全问题。我对下面的代码有几个问题: 我有一张尺寸和尺码相同的鞋类尺码表(例如,尺码:9.5=尺码:也可以是9.5) 我的处理文件检查,然后从上一个html表单页面检索所选大小 <?php $link = mysqli_connect("servert", "user", "passW", "footwear"); if(!$link){ printf("Can't connect to
<?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";
}
}
?>
显然,当我省略它并直接转到查询时,代码工作正常:
$stmt=mysqli_prepare($link,"SELECT `sizeid`,`size` FROM `size` WHERE `sizeid`");
二,。据我所知,我的理解是问号(?)用作占位符,然后在mysqli_stmt_bind_param中绑定;但是当我尝试的时候
if($stmt=mysqli_prepare($link,"SELECT `sizeid`,`size` FROM `size` WHERE `?`"))…
mysqli_stmt_bind_param($stmt,"i", $sizeid);
它不起作用。
“隐藏”变量的想法不是吗
三,。将mysqli\u real\u escape\u字符串
和htmlspecialchars
放在一起可以吗,还是会有伤害。如果不是的话,为什么?如果可以的话,如果这有什么区别的话,应该先叫一个吗
四,。我需要将尺寸输出为浮动,因为现实世界中的鞋尺寸是如此(即7.5、9.5等)
我选择的方法(floatval和sprint)是否存在任何危险?
mysqli\u stmt\u init
创建一个准备好的语句对象mysqli_prepare
为其分配查询。您应该将$stmt
传递给mysqli\u prepare
mysqli\u stmt\u bind\u参数
用于传递值以替换?
$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文档:
mysqli\u real\u escape\u string
仅用于在将值插入数据库之前对其进行转义。您准备好的语句可以为您实现这一点,因此这里根本不需要mysqli\u real\u escape\u string
htmlspecialchars
用于在网页上显示HTML字符,它会将它们转义,这样浏览器就不会对它们进行分析。?
占位符仅用于以下值:其中`size`=?
关于#3、mysqli\u real\u escape\u字符串
和htmlspecialchars
做了非常不同的事情。我建议你阅读每一个的文档。谢谢,火箭危险品。这部分:其中大小=?,我知道并理解。所以,我认为我写的方式是正确和安全的?谢谢,马特·鲍尔。我不理解这两个函数做不同的事情。只是想知道他们之间是否有任何危险或冲突。
$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);