了解准备好的陈述; mysqli_real_escape_string和htmlspecialchars

时间:2013-02-04 18:37:12

标签: php

我是编程的新手,只知道程序化的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_stringhtmlspecialchars放在一起是否正常或有害?如果没有原因,如果它没有问题,是否应该在另一个之前被召唤出来,如果这有什么不同呢?

4。我需要尺寸作为浮动输出,因为现实世界的鞋子尺寸是这样的(即7.5,9.5等) 我选择这样做的方法有任何危险吗(floatval和sprint)?

1 个答案:

答案 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字符,它会使它们脱离,因此浏览器无法解析它们。