【问题标题】:PHP - How to insert while loop checkbox and save to mysqlPHP - 如何插入while循环复选框并保存到mysql
【发布时间】:2014-07-07 08:55:42
【问题描述】:

while 循环复选框名称为 checkextra[],值为使用 php <?php echo $show_extra['price']; ?> 的价格回显

现在以下代码仅适用于价格 - 它与我选中的复选框完美保存。但是$show_extra['item_name'] 并没有相应地保存。在 DB 中,所有 item_name 都给了我最后一个 while 循环 item ,它与完美保存的价格不同。

下面的代码我修改了很多时间,但item_name的输出还是一样

<div class="adjust">
<center><form class="greatForm" method="post" action="#">
<?php
$read_extra = mysql_query("select * from extra_item where theme_name = '$title'");

while($show_extra = mysql_fetch_array($read_extra))
{
    $getextraname = $show_extra['item_name'];

?>
    <input type="checkbox" name="checkextra[]" id="<?php echo       $show_extra['item_label']; ?>" value="<?php echo $show_extra['price']; ?>"/>
    <label for="<?php echo $show_extra['item_label']; ?>" >
    <img style="height:150px;width:150px;" src="<?php echo 'themeinfo/extra/'.$show_extra['item_img']; ?>"/><?php echo $show_extra['item_name']; ?>  </label>

<?php
}
 ?>
<center><br><br><input type="submit" class="button" style="width:10%;" value="SAVE"  name="choose_extra"></center></br>
</form></center>
<?php


    if(isset($_POST['choose_extra']))
{
    if(!empty($_POST['checkextra'])) {
    foreach($_POST['checkextra'] as $getextraprice) {
    $takeextra = mysql_query("INSERT INTO selectextra(user,title,extraitem,price) 
                            VALUES('".mysql_real_escape_string($username)."',
                                '".mysql_real_escape_string($title)."',
                                '".mysql_real_escape_string($getextraname)."',
                                '".mysql_real_escape_string($getextraprice)."')") or die(mysql_error());

        }
        if($takeextra)
            {
                echo "<center>Extra item order SAVE.</center>";
            }
            else{
                echo "failed";
            }
    }
}

?>

</div>

DB item_name 都一样

-- Table structure for table `extra_item`
--

CREATE TABLE IF NOT EXISTS `extra_item` (
`theme_name` varchar(500) NOT NULL,
`item_name` varchar(500) NOT NULL,
`item_label` varchar(500) NOT NULL,
`price` int(10) NOT NULL,
`item_img` varchar(500) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--

-- Table structure for table `selectextra`
--

CREATE TABLE IF NOT EXISTS `selectextra` (
`user` varchar(500) NOT NULL,
`title` varchar(500) NOT NULL,
`extraitem` varchar(500) NOT NULL,
`price` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--

- - 转储表selectextra的数据 --

INSERT INTO `selectextra` (`user`, `title`, `extraitem`, `price`) VALUES
('qweqwe', 'test', 'red balloon4', 10),
('qweqwe', 'test', 'red balloon4', 10),
('qweqwe', 'test', 'red balloon4', 1),
('qweqwe', 'test', 'red balloon4', 1),
('qweqwe', 'test', 'red balloon4', 1),
('qweqwe', 'test', 'red balloon4', 2),

【问题讨论】:

  • mysql_query 已弃用,对 mysqli_query 进行一些研究,您应该在实施后收到更详细的错误。
  • 我认为在您的查询中,您需要将$title 从单引号中取出,因为不会提取该变量中的值。所以它应该是:"select * from theme where title = '" . $title . "'
  • @CoderDojo 但我正在使用 phpmyadmin
  • @user1849060 hi ,但问题不存在。而且那个也不是复选框和while循环,我要求插入问题
  • 您的插入不在循环中。它只能进行一次插入,并且似乎没有注意到选中了哪些复选框。

标签: php html mysql css checkbox


【解决方案1】:

首先必须将$_SESSION['itemname'] = array(); 放在html 之上

<div class="adjust">
<center><form class="greatForm" method="post" action="#">
<?php
$read_extra = mysql_query("select * from extra_item where theme_name = '$title'");
$a = 1;
while($show_extra = mysql_fetch_array($read_extra))
{
    $_SESSION['getextraname'] = $show_extra['item_name'];

?>
    <input type="checkbox" name="checkextra<?php echo $a?>" id="<?php echo   $show_extra['item_label']; ?>" value="<?php echo $show_extra['price']; ?>"/>
    <label for="<?php echo $show_extra['item_label']; ?>" >
    <img style="height:150px;width:150px;" src="<?php echo 'themeinfo/extra/'.$show_extra['item_img']; ?>"/><?php echo $show_extra['item_name']; ?></label>
    <input type="hidden" name="getextraname<?php echo $a?>" value="<?php echo   $show_extra['item_name']; ?>"/>

<?php
$a = $a+1;
}
 ?>
 <center><br><br><input type="submit" class="button" style="width:10%;" value="SAVE" name="choose_extra"></center></br>
</form></center>
<?php


    if(isset($_POST['choose_extra']))
 {


    $number = mysql_query("select COUNT(*) as num from extra_item where  theme_name = '$title'");
    $number_data = mysql_fetch_array($number);

    for($x=1;$x<=$number_data['num'];$x++)
    {
        if(isset($_POST['checkextra'.$x]))
        {
            array_push($_SESSION['itemname'],$_POST['getextraname'.$x]);
        }

    }


    foreach($_SESSION['itemname'] as $keyname)
    {
        $redname = mysql_query("select * from extra_item where theme_name = '$title' and item_name='$keyname'");
        $takename = mysql_fetch_array($redname);
        $getextraname = $takename['item_name'];
        $getextraprice = $takename['price'];

        $saveallextra = mysql_query("insert into selectextra(user,title,extraitem,price) values('$username','$title','$getextraname',$getextraprice)");

        if($saveallextra)
            {
                echo "<center>Extra item order SAVE.</center>";
            }
            else{
                echo "Failed";
            }

    }

}

?>

</div>

【讨论】:

    【解决方案2】:

    更改为 mysqli,并带有一些消息以输出调试信息,试试这个(设置数据库连接字段以适合您的数据库):-

    <div class="adjust">
    <?php
    
    $link = new mysqli("hostname", "username", "password", "databasename");
    
    if ($link->connect_errno) 
    {
        printf("Connect failed: %s\n", $link->connect_error);
        exit();
    }
    
    ?>
    <center><form class="greatForm" method="post" action="#">
    <?php
    
    $sql = "SELECT price, item_name, item_label, item_img FROM extra_item WHERE theme_name = '$title'";
    
    if ( ($read_extra = $link->query($sql)===false )
    {
      echo "Invalid query: ".$link->error."\r\n $sql\r\n";
      exit();
    }
    
    while($show_extra = $read_extra->fetch_array(MYSQLI_ASSOC))
    {
        $_SESSION['getextraprice'] = $show_extra['price'];
        $_SESSION['getextraname'] = $show_extra['item_name'];
    ?>
        <input type="checkbox" name="<?php echo $show_extra['price']; ?>" id="<?php echo $show_extra['item_label']; ?>" value="<?php echo $show_extra['item_label']; ?>"/>
        <label for="<?php echo $show_extra['item_label']; ?>" >
        <img style="height:150px;width:150px;" src="<?php echo 'themeinfo/extra/'.$show_extra['item_img']; ?>"/><?php echo $show_extra['item_name']; ?></label>
    
    <?php
    }
     ?>
    <center><br><br><input type="submit" class="button" style="width:10%;" value="SAVE" name="choose_extra"></center></br>
    </form></center>
    <?php
        if(isset($_POST['choose_extra']))
        {
            $getextraprice = $_SESSION['getextraprice'];
            $getextraname = $_SESSION['getextraname'];
            $sql = "INSERT INTO selectextra(user,title,extraitem,price) VALUES('$username','$title','$getextraname,'$getextraprice')";
            if ( ($insert = $link->query($sql)===false )
            {
              echo "failed: ".$link->error."\r\n $sql\r\n";
            }
            else
            {
                echo "Order SAVE.";
            }
        }
    ?>
    
    </div>
    
    </div>
    

    编辑 - 如果你真的想使用 mysql_* 调用,那么试试这个,这至少会让你知道错误是什么:-

    <div class="adjust">
    <center><form class="greatForm" method="post" action="#">
    <?php
    $read_extra = mysql_query("SELECT price, item_name, item_label, item_img FROM extra_item where theme_name = '".mysql_real_escape_string($title)."'") or die(mysql_error());
    
    while($show_extra = mysql_fetch_array($read_extra))
    {
        $_SESSION['getextraprice'] = $show_extra['price'];
        $_SESSION['getextraname'] = $show_extra['item_name'];
    ?>
        <input type="checkbox" name="<?php echo $show_extra['price']; ?>" id="<?php echo $show_extra['item_label']; ?>" value="<?php echo $show_extra['item_label']; ?>"/>
        <label for="<?php echo $show_extra['item_label']; ?>" >
        <img style="height:150px;width:150px;" src="<?php echo 'themeinfo/extra/'.$show_extra['item_img']; ?>"/><?php echo $show_extra['item_name']; ?></label>
    
    <?php
    }
     ?>
    <center><br><br><input type="submit" class="button" style="width:10%;" value="SAVE" name="choose_extra"></center></br>
    </form></center>
    <?php
        if(isset($_POST['choose_extra']))
        {
            $getextraprice = mysql_real_escape_string($_SESSION['getextraprice']);
            $getextraname = mysql_real_escape_string($_SESSION['getextraname']);
            $takeextra = mysql_query("INSERT INTO selectextra(user,title,extraitem,price) VALUES('".mysql_real_escape_string($username)."','".mysql_real_escape_string($title)."','$getextraname,'$getextraprice')") or die(mysql_error());
    
            if($takeextra)
            {
                echo "Order SAVE.";
            }
            else{
                echo "failed";
            }
        }
    ?>
    
    </div>
    
    </div>
    

    如果您想获取已勾选的复选框,则可以这样做:-

    <div class="adjust">
    <center><form class="greatForm" method="post" action="#">
    <?php
    $read_extra = mysql_query("SELECT price, item_name, item_label, item_img FROM extra_item where theme_name = '".mysql_real_escape_string($title)."'") or die(mysql_error());
    
    while($show_extra = mysql_fetch_array($read_extra))
    {
        $_SESSION['getextraprice'] = $show_extra['price'];
        $_SESSION['getextraname'] = $show_extra['item_name'];
    ?>
        <input type="checkbox" name="<?php echo $show_extra['price']; ?>" id="<?php echo $show_extra['item_label']; ?>" value="<?php echo $show_extra['item_label']; ?>"/>
        <label for="<?php echo $show_extra['item_label']; ?>" >
        <img style="height:150px;width:150px;" src="<?php echo 'themeinfo/extra/'.$show_extra['item_img']; ?>"/><?php echo $show_extra['item_name']; ?></label>
    
    <?php
        if(isset($_POST['choose_extra']) and array_key_exists($show_extra['price'], $_POST) and $_POST[$show_extra['price']] != '')
        {
            $takeextra = mysql_query("INSERT INTO selectextra(user, title, extraitem, price) 
                                    VALUES('".mysql_real_escape_string($username)."',
                                        '".mysql_real_escape_string($title)."',
                                        '".mysql_real_escape_string($show_extra['item_name'])."',
                                        '".mysql_real_escape_string($_POST[$show_extra['price']])."')") or die(mysql_error());
        }
    }
     ?>
    <center><br><br><input type="submit" class="button" style="width:10%;" value="SAVE" name="choose_extra"></center></br>
    </form></center>
    </div>
    </div>
    

    请注意,这只是一个猜测,因为字段名称是数字价格的字段似乎很奇怪。

    编辑 - 根据猜测进一步更新:-

    <div class="adjust">
    <center><form class="greatForm" method="post" action="#">
    <?php
    $read_extra = mysql_query("select id, item_label, price, item_name, item_img from extra_item where theme_name = '$title'");
    
    while($show_extra = mysql_fetch_array($read_extra))
    {
        echo "<input type='checkbox' name='checkextra[".$show_extra['id']."]' id='".$show_extra['item_label']."' value='".$show_extra['price']."'/>";
        echo "<label for='".$show_extra['item_label']."' >";
        echo "<img style='height:150px;width:150px;' src='themeinfo/extra/'".$show_extra['item_img']."'/>".$show_extra['item_name']."</label>";
        echo "<input type='hidden' name='item_name[".$show_extra['id']."]' value='".$show_extra['item_name']."'/>";
    }
    
    echo "<center><br><br><input type='submit' class='button' style='width:10%;' value='SAVE'  name='choose_extra'></center></br>";
    echo "</form></center>";
    
    if(isset($_POST['choose_extra']))
    {
        foreach($_POST['checkextra'] as $getextraprice_id=>$getextraprice) 
        {
            $takeextra = mysql_query("INSERT INTO selectextra(user,title,extraitem,price) 
                                    VALUES('".mysql_real_escape_string($username)."',
                                        '".mysql_real_escape_string($title)."',
                                        '".mysql_real_escape_string($_POST['item_name'][$getextraprice_id])."',
                                        '".mysql_real_escape_string($getextraprice)."')") or die(mysql_error());
    
        }
        if($takeextra)
        {
            echo "<center>Extra item order SAVE.</center>";
        }
        else
        {
            echo "failed";
        }
    }
    
    ?>
    
    </div>
    

    将带有价格值的复选框和包含 item_name 的隐藏字段放在一起。两者都是数组。这些数组的索引应该匹配。当您处理表单时,您会遍历复选框,您将获得每个复选框数组项的索引,并将其用作访问 item_name 字段的索引。

    再次编辑。使用序列号来强制表单元素数组的索引(可能应该是必要的,但我更喜欢强制执行)而不是使用表中的字段。

    <div class="adjust">
    <center><form class="greatForm" method="post" action="#">
    <?php
    
    $conn = mysql_connect('localhost', 'root', '');
    mysql_select_db('test', $conn);
    $title = 'fred';
    $username = 'jo';
    
    $read_extra = mysql_query("SELECT item_label, price, item_name, item_img FROM extra_item WHERE theme_name = '$title'");
    
    $row_cnt = 0;
    while($show_extra = mysql_fetch_array($read_extra))
    {
        echo "<input type='checkbox' name='checkextra[$row_cnt]' id='".$show_extra['item_label']."' value='".$show_extra['price']."'/>";
        echo "<label for='".$show_extra['item_label']."' >";
        echo "<img style='height:150px;width:150px;' src='themeinfo/extra/'".$show_extra['item_img']."'/>".$show_extra['item_name']."</label>";
        echo "<input type='hidden' name='item_name[$row_cnt]' value='".$show_extra['item_name']."'/>";
        $row_cnt++;
    }
    
    echo "<center><br><br><input type='submit' class='button' style='width:10%;' value='SAVE'  name='choose_extra'></center></br>";
    echo "</form></center>";
    
    if(isset($_POST['choose_extra']))
    {
        foreach($_POST['checkextra'] as $getextraprice_id=>$getextraprice) 
        {
            $takeextra = mysql_query("INSERT INTO selectextra(user,title,extraitem,price) 
                                    VALUES('".mysql_real_escape_string($username)."',
                                        '".mysql_real_escape_string($title)."',
                                        '".mysql_real_escape_string($_POST['item_name'][$getextraprice_id])."',
                                        '".mysql_real_escape_string($getextraprice)."')") or die(mysql_error());
    
        }
        if($takeextra)
        {
            echo "<center>Extra item order SAVE.</center>";
        }
        else
        {
            echo "failed";
        }
    }
    
    ?>
    
    </div>
    

    【讨论】:

    • 我不懂mysqli
    • 它实际上与您已经在使用的 sql 普通 mysql_* 调用相同。但主要要做的是添加调试,以便我们了解您的代码失败的错误是什么
    • 但我的问题是如何将复选框名称和值插入数据库。复选框由while循环生成。
    • 你说它出现了“失败”的消息。但这并没有说明为什么它失败了(因此需要额外的代码来输出 mysql 错误消息)。输出后,您不知道读取值的复选框名称是什么,处理它们的最简单方法是循环,但您评论说“问题说是循环复选框而不是循环插入”。如果你想处理已经选中的复选框,那么最好的地方是在输出复选框的循环中,因为你知道输出字段的名称。
    • 实际上失败的是回显,如果查询不插入回显失败。我已经更新了我的问题。我将复选框名称设置为name="checkextra[]",现在它给了我这个 *Notice: Array to string conversion in D:\xampp\htdocs*
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2012-04-23
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多