0

我有查询使用数组和for循环将值插入MySQL数据库。但是当我提交表单MySQL数据库时显示双重输入。第一条记录为空,第二条记录有值?为什么 MySQL 数据库显示 First Record Empty Entry。我不知道它背后的原因是什么?

这里我的功能代码

<?php 
if(isset($_REQUEST['order'])) 
{
$count=1;
$count++;   
$total=$_POST['total']; 
for ($i=1; $i<=$count; $i++){
$queryproduct=mysql_query("INSERT INTO shoppingcart VALUES    ('','','','$uid','$email','".$_POST['product'][$i]."','".$_POST['userfile_name'] [$i]."','".$_POST['price'][$i]."','".$_POST['qty'][$i]."','".$_POST['amt'][$i]."','$total')") or die("Order  Query Problem");    
}
}
?>
4

2 回答 2

0

我将首先忽略这段代码的安全问题,我们可以稍后再回到那部分。让我们首先处理我看到的正确方法的问题。

第一条记录为空,第二条记录有值?为什么 MySQL 数据库显示 First Record Empty Entry。我不知道它背后的原因是什么?

$count=1;
$count++;

这里发生了什么?你设置一个$count等于1,然后你2在第二行也立即将它加一。你为什么这样做?为什么不首先将它设置为两个呢?

我敢打赌,您对第一条记录为空的问题从这些代码行开始。

$total = $_POST['total'];

这仅在查询中使用一次,所以为什么将它分配给另一个变量你只是在浪费内存。

从您的代码的第一个示例中,我会说这将是您可以从中获得的最佳执行(同样,不是在谈论安全性)。

<?php 
if(isset($_REQUEST['order'])) 
{
    for ($i = 1, $count = 0; $i <= $count; ++$i)
    {
        $queryproduct = mysql_query
        (
            "INSERT INTO shoppingcart VALUES
            (
                '',
                '',
                '',
                '$uid',
                '$email',
                '{$_POST['product'][$i]}',
                '{$_POST['userfile_name'][$i]}',
                '{$_POST['price'][$i]}',
                '{$_POST['qty'][$i]}',
                '{$_POST['amt'][$i]}',
                '{$_POST['total']}'
            );"
        )
        or die("Order Query Problem");
    }
}
?>

查看您的第二组代码,这可能是您可以用它做的最好的事情。

<?php
    if(isset($_REQUEST['order']))
    {
        for($i = 0, $p = count($_POST['product']); $i < $p; ++$i)
        {
            $queryproduct = mysql_query
            (
                "INSERT INTO shoppingcart VALUES
                (
                    '',
                    '',
                    '{$_POST['pid'][$i]}',
                    '$uid',
                    '$email',
                    '{$_POST['product'][$i]}',
                    '{$_POST['userfile_name'][$i]}',
                    '{$_POST['price'][$i]}',
                    '{$_POST['qty'][$i]}',
                    '{$_POST['amt'][$i]}',
                    '{$_POST['total']}'
                );"
            )
            or die("Order Query Problem");
        }
    }
?>

最后,这个是关于安全性的。如果我们使用 PHP 代码库中的一些非弃用函数,我们可以使这些语句安全。

PDO 是这些接口中最常见的,您可以找到设置与 SQL 数据库的 PDO 连接所需的所有文档。

<?php
    if(isset($_REQUEST['order']))
    {
        $stmt = $dbh->prepare("INSERT INTO shoppingcart VALUES ('', '', ?, ?, ?, ?, ?, ?, ?, ?, ?);");

        $stmt->bindParam(1, $pid);

        $stmt->bindParam(2, $uid);
        $stmt->bindParam(3, $email);

        $stmt->bindParam(4, $product);
        $stmt->bindParam(5, $name);
        $stmt->bindParam(6, $price);
        $stmt->bindParam(7, $qty);
        $stmt->bindParam(8, $amt);

        $stmt->bindParam(9, $total);

        for($i = 0, $p = count($_POST['product']); $i < $p; ++$i)
        {
            $pid = $_POST['pid'][$i]);

            $product = $_POST['product'][$i]);
            $name = $_POST['userfile_name'][$i]);
            $price = $_POST['price'][$i]);
            $qty = $_POST['qty'][$i]);
            $amt = $_POST['amt'][$i]);

            $total = $_POST['total'];
        }

        $stmt->execute();
    }
?>

这些将为您正确转义查询语句。一个巨大的帮助,当我们都无法了解每个攻击向量并且专家已经提出了如何修复最常见攻击向量的代码时。

于 2013-03-03T21:23:44.797 回答
0

尝试从 0 开始循环,因为 $_POST["pid"] 变量从 0 开始编号,如第二个(工作)示例:

for($i=0; $i<$lenght; $i++){ ...

但是,请避免使用 mysql_* 函数,正如 Matt Ball 在他的评论中所说的那样。

于 2013-03-03T20:50:37.287 回答