PHP表单循环只提交最后一个值或所有值。

问题描述 投票:0回答:1

背景是:电子商务,问题在于将物品添加到购物车中。

我创建了一个 while 循环来遍历我的查询返回的每个物品,每个物品都有一个按钮,重定向到 "物品信息 "页面。我的问题是,由于有一个循环,提交的值(例如项目的ID)是超载的,每个按钮都提交最后一个项目的值。我可以传递所有植物的ID,但我不知道如何在 "项目详情 "页面中显示正确的项目。

lista-piante.php: (摘要)

<?php session_start();

// connect to the database
$connessione = new mysqli('localhost', 'root', 'root', 'mio');

    //query
    $user_check_query = "SELECT Pianta.NOME as nome, PIANTA.ID as pid, Item.PREZZO as prezzo, Item.ID as id 
    FROM Item, Pianta WHERE Pianta.ID = Item.PIANTA";
    $result = mysqli_query($connessione, $user_check_query);

    if($result->num_rows > 0) {
        echo"<h3>Lista delle nostre piante</h3>";

        echo"<ul class=\"plant-flex\">";

        // loop through records
        while($row = $result->fetch_array(MYSQLI_ASSOC)){

            echo"<form method='get' action='../html/details-pianta.php'>";

            echo"<li>";
            echo"<div class='plant-preview'>";
            echo"<div class='plant-preview-description'>";

            //dichiarazione variabili (per leggibilità)
            $nome= $row['nome'];
            $pid = $row['pid'];

            // PRINT NAME
            echo"<div class='plant-preview-description-name'>";
            echo "<p class='bold'>" . $nome . "</p>";
            echo "<input type='hidden' name='name' value='$nome'  />";
            echo"</div>";


            echo "<input type='hidden' name='pid[]' value='$pid'  />";

            echo"<div>";
            echo"<button type=\"submit\" class=\"btn\" name=\"details_plant\">Dettagli" . $item . "</button>";
            echo"</div>";

            echo"</li>";
            echo"<form/>";

        }
        $result->free();

}
echo "<ul/>";
$connessione->close();

details-pianta.php。(总结一下,它将包含页面的风格)

<?php session_start();?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">


<head> <!-- meta tag and other stuff --> </head>

<body>
            <div>
                <?PHP include('../php/dettagli-pianta.php'); ?>
            </div>
</div>

</body>
</html>

dettagli-pianta.php。(总结一下,它应该包含每个项目的信息)

<?php
session_start();

// connect to the database
$connessione = new mysqli('localhost', 'root', 'root', 'mio');

$pid = mysqli_real_escape_string($connessione, $_GET['pid']);


//but pID is either the last item's id, or an array with all items' ids, so i can't chose the only one i want
//the URL shows always more pIDs (from the lista-piante.php get form)

$user_check_query = "SELECT * FROM Pianta, item WHERE Pianta.ID = '$pid' ";
$result = mysqli_query($connessione, $user_check_query);

if($result->num_rows > 0) {


    echo"<h3>Dettagli della pianta</h3>";
    echo"<ul>";

    //loop thought query records
    while($row = $result->fetch_array(MYSQLI_ASSOC)){

        echo"<form method='post' action='../php/add-carrello.php'>";


        echo"<li>";
        echo"<div>";

        //dichiarazione variabili (per leggibilità)
        $nome =$row['NOME'];
        //$genere= $row['GENERE'];
        //$specie= $row['SPECIE'];
        //etc etc


        // PRINT NAME
        echo"<div>";
        echo "<p class='bold'>" . $nome . "</p>";
        echo"</div>";


        //echo"<div>";
        //echo "<p class='bold'>" . $specie. "</p>";
        //echo"</div>";


        //echo "<input type='hidden' name='pid' value='$pid'  />";

        echo"<div>";
        echo"<button type=\"submit\" class=\"btn\" name=\"add-carrello\"> Aggiungi al carrello</button>";
        echo"</div>";

        echo"</li>";

    }
    $result->free();

}
echo "<ul/>";

$connessione->close();
php forms
1个回答
0
投票

表单关闭时出现了一个错误,但... 我有一种感觉,你使用所有这些表单按钮,让你自己变得复杂了。

我会清理代码,完全摆脱formbutton方案,并使用简单的 a href 联系 ?id=$pid

类似这样的(缩短了,如果需要可以发个评论,我可以展开)。

while($row = $result->fetch_array(MYSQLI_ASSOC)){

            echo "<li>";
            echo "<div class='plant-preview'>";
            echo "<div class='plant-preview-description'>";

            //dichiarazione variabili (per leggibilità)
            $nome = $row['nome'];
            $pid = $row['pid'];

            // PRINT NAME
            echo "<div class='plant-preview-description-name'>";
            echo "<p class='bold'>" . $nome . "</p>";
            echo "</div>";

            echo "<div>";
            echo "<a href ='../html/details-pianta.php?pid=$pid'>Dettagli " . $nome . "</a>";
            echo "</div>";

            echo "</li>";

        }

你可以用CSS把你的a-href链接变成一个按钮,添加图片,或者用任何你喜欢的方式来玩。

然后在产品详情页(dettagli-pianta.php)中使用你的产品id和你已经做的差不多。

$pid = $_GET['pid']
...
$user_check_query = "SELECT * FROM Pianta WHERE Pianta.ID = '$pid' ";

这里有一个Stack Overflow,讲的是用链接代替表单。如何在不使用表单的情况下发送参数到url?

编辑 (发现错误,提出更多建议,如果你还想保留表单按钮)。

  • 你没有关闭 ?> 在你的例子中,但好吧,可能只是复制粘贴在这里。
  • 你有 $item 变量没有定义,也没有从SELECT查询中提取,所以我只能认为那应该是 $nome (或者你删除了一些东西,使其在问题中变得更短,而忘记了它)
  • 你可能还想要一个这样的空格(注意Dettagli后面的空格)

echo "<button type='submit' class='btn' name='details_plant'>Dettagli " . $nome . "</button>";

  • 不知道为什么你把文件放在"...html "和"...php "两个文件夹里,而这两个文件夹的扩展名都是.php,这可能会让其他人在以后使用你的代码时感到困惑,或者.......也许这只是我的错觉
  • 你有 <?php session_start();?> 然后在它下面包含一个文件,其中也有 <?php session_start();?> ...不需要其中之一。由于 "details-pianta.php "在 "html "文件夹中,我想你可以把它从那里删除,因为你不需要session来包含另一个PHP文件。
  • 在您提交的表格中 name='pid[]' 当你应该只用 name='pid' (没有括号), 像这样:

    echo "<input type='hidden' name='pid' value='$pid' />";

  • 在 "dettagli -pianta. php "中,你有一个select,像这样。$user_check_query = "SELECT * FROM Pianta, item WHERE Pianta.ID = '$pid' "; 在这里你命名了两个表,但没有连接它们,我只能假设它应该是 $user_check_query = "SELECT * FROM Pianta WHERE Pianta.ID = '$pid' ";

  • 数据库和列名要注意大写小写,尽量标准化。
  • 你用混杂的引号来呼应,比如说 echo "<bla name='bla'>" 而在接下来,你逃避的引号,如 echo "<bla name=\"bla\">" ......让自己轻松一点,并且--标准化。除非绝对必要,第一种方式(混合单引号和双引号)是比较好的,只有当你有一些非常复杂的东西要呼应时,比如HTML+JavaScript的混合,才会使用转引号。

最后,但实际上是对你的问题的直接回答--你以错误的方式关闭了你的表格(是的,必须仔细看才能看到它)。

echo"<form/>";

你需要有(空格是可选的,读起来更好)。

 echo "</form>";

Non the less, as others too have already commented, using forms just to get buttons is an overkill. 尝试使用简单的链接(<a href> 元素),并根据自己的喜好使用CSS样式,使它们看起来像按钮......。

最后,但是... 我认为这一点很重要... 尽量不要在代码中混用意大利语和英语(包括数据库结构)。很明显你只是在学习,但如果有一个名为 "mio "的数据库,其中有表 "pianti "和列 "prezzo"......那就用 "item "这样的名字。另外,文件的名字像 "details-pianta",然后你有另一个文件 "detaggli_pianta",在按钮的名字中你使用了 "details_plant",这是两种语言的巨大混搭。从你的问题来看,你似乎会说流利的英语,那么--为什么不在代码中到处使用英语呢?把你的数据库命名为 "my_first_web_store",把你的表命名为 "plants",把你的列命名为 "price",把你的PHP文件命名为 "plant_details"(或者details_plant,不管是什么),在你的代码中使用英文注释(除了你和其他开发者之外,没有人会看到)。当你的植物销售公司扩展到全球时,当你有了多语言的网络商店时,你会感激不尽的,也许还会有3个来自印度和美国的开发者在同一个项目上工作......:)

祝你学习愉快

© www.soinside.com 2019 - 2024. All rights reserved.