Php 理解编写的声明;mysqli\u real\u escape\u字符串和htmlspecialchars

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。我一直在研究准备好的声明和其他安全问题。我对下面的代码有几个问题:

我有一张尺寸和尺码相同的鞋类尺码表(例如,尺码:9.5=尺码:也可以是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";
}
}
?>
显然,当我省略它并直接转到查询时,代码工作正常:

$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);