1

我是编程新手,只知道程序 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_string3.和htmlspecialchars在一起好吗?如果不是为什么,如果没关系,是否应该在另一个之前叫出一个,如果这有什么不同吗?

4. 我需要将尺码输出为浮点数,因为现实世界的鞋码是这样的(即 7.5、9.5 等)。我选择这样做的方法(floatval 和 sprint)有什么危险吗?

4

1 回答 1

2

mysqli_stmt_init创建一个准备好的语句对象。 mysqli_prepare为其分配一个查询。你应该传递$stmtmysqli_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 字符,它将它们转义,因此它们不会被浏览器解析。

于 2013-02-04T18:51:00.653 回答