【问题标题】:Automate VALUEs based on how many inputs the form contains根据表单包含的输入数量自动执行 VALUE
【发布时间】:2013-05-28 14:38:39
【问题描述】:

如何进行自动查询,根据输入的名称:名称、成分和价格添加另一个 VALUES 行?

表单如下所示:

当您按下新行时,会出现另一个“新项目”框,我希望 SQL 记录有多少行。每个“新项目”= 查询的新值。

SQL:

if($_SERVER['REQUEST_METHOD'] == 'POST'){

$status_input = $stmt = $dbh ->prepare("
    INSERT INTO menues(
            restaurant_id,
            title,
            subtitle,
            name,
            ingredients,
            price,
            category,
            upload_date) 

    VALUES
    (:restaurant_id,:title, :subtitle, :name, :ingredients, :price, :category, NOW())
    (:restaurant_id,:title, :subtitle, :name, :ingredients, :price, :category, NOW())
    (:restaurant_id,:title, :subtitle, :name, :ingredients, :price, :category, NOW())
");
    $stmt->bindParam(":restaurant_id", $userdata[0]['user_id']);
    $stmt->bindParam(":title", $_POST['title']);
    $stmt->bindParam(":subtitle", $_POST['subtitle']);
    $stmt->bindParam(":name", $_POST['name']);
    $stmt->bindParam(":ingredients", $_POST['ingredients']);
    $stmt->bindParam(":price", $_POST['price']);
    $stmt->bindParam(":category", $userdata[0]['category']);
    $stmt->execute();
}

Restaurant_id、title、subtitle、category 和 upload_date 对于每一行都应该相同。

jQuery 和 HTML:

$(document).ready( function() {
  $('.newmenu').hide();
  $('.zero h3 a').click(function() {
    $('.newmenu').slideToggle();
  });
  $('.newmenu > ul li p.add').click(function(){
    $('.newmenu > ul li.edit').before("<li class='newrow'><h6>New item</h6><div><p>Name:</p><input type='text' name='name' placeholder='name' /></div><div><p>Ingredients:</p><input type='text' name='ingredients' placeholder='ingredients' /></div><div><p>Price:</p><input type='text' name='price' placeholder='price' /></li>");
  });
});

<form method='post' action='newmenu.php' class='newmenu'>
  <table>
    <tr><td>Namn:</td><td><input type='text' name='title' placeholder='namn' /></td></tr>
    <tr><td>Undertext:</td><td><input type='text' name='subtitle' placeholder='namn' /></td></tr>
  </table>
  <ul>
    <li class='newrow'>
      <h6>New item</h6>
      <div>
        <p>Name:</p>
        <input type='text' name='name' placeholder='name' />
      </div>
      <div>
        <p>Ingredients:</p>
        <input type='text' name='ingredients' placeholder='ingredients' />
      </div>
      <div>
        <p>Price:</p>
        <input type='text' name='price' placeholder='price' />
      <div>
    </li>
    <li class="edit">
      <input type="submit" value="Submit">
      <p class="add">New row</p>
    </li>
  </ul>
</form>

【问题讨论】:

  • 表单是如何发布的?
  • method="post" and action="new_menu.php" - new_menu.php = 上面的代码。如果我的答案很糟糕,我没有再问这个问题了哈哈。您可以通过单击右侧的提交来发布它。
  • 当您点击“新行”时会发生什么?它是用 javascript 动态添加的吗?
  • 当您点击提交时,这些新的表单元素是否也被添加到 POST 中?

标签: php mysql forms


【解决方案1】:

你可以试试这个:

将所有输入字段名称更改为以 [] 结尾(在 Jquery 代码和 HTML 中)。

现在你得到了返回的数组。

然后你像这样处理它们:

$name = $_POST["food_name"];
$ingredient = $_POST["food_ingredient"];
$price = $_POST["food_price"];
$length = count($name);

// Starting the query
$query = "INSERT INTO menues(
              restaurant_id,
              title,
              subtitle,
              name,
              ingredients,
              price,
              category,
              upload_date) 
          VALUES";

// Looping through all the input rows
for($key=0;$key<$length;$key++){
    // Create each insert
    $query .= "(:id,:title,:subtitle,:name_".$key.",:ingredient_".$key.",:price_".$key.",:cat,NOW())";
    // Check if its the last row
    $query .= (($key +1 == $length)?"":","); 
}

// Now the query is done, next step is adding values to placeholders
$insert = $pdo->prepare($query);

// Create an array with matching placeholders
$param = array();
for($key=0;$key<$length;$key++){
    $param[":name_".$key] = $name[$key];
    $param[":ingredient_".$key] = $ingredient[$key];
    $param[":price_".$key] = $price[$key];
}   

// Add more parameters if wanted
// $param[":id"] = 1;

// Execute with parameters created above
$insert->execute($param);

【讨论】:

  • $query .= (($key +1 == $length)?"":",");@QuakeDK 上获得意外的 t_variable
  • @NabilGhulam 上面的行不见了;学习如何理解 PHP 的错误,你会节省很多时间:)
  • 嗯,我们可以加入一个聊天伙伴吗? @QuakeDK - 那里的代码还有更多
  • @NabilGhulam 当然,检查您的电子邮件。
【解决方案2】:

尝试这些更改。我在代码中添加了 cmets。

基本上,我在表单字段名称中添加了一个数字,以便您区分它们。所以第一个名字是name_0,那么当你用javascript添加一行时,下一个名字就是name_1。然后在 PHP 中创建一个循环并检查是否有 name_0,然后在下一个循环中检查是否有 name_1 等等。当它找不到更多行时,它使用break; 退出循环。

我还没有测试过代码,但基本上它应该可以工作。尝试自己实现它而不是复制粘贴。阅读 cmets 并查看我在代码中所做的更改。

祝你好运。

HTML:

<!--
Make the first fields use row number 0
-->

<form method='post' action='newmenu.php' class='newmenu'>
  <table>
    <tr><td>Namn:</td><td><input type='text' name='title' placeholder='namn' /></td></tr>
    <tr><td>Undertext:</td><td><input type='text' name='subtitle' placeholder='namn' /></td></tr>
  </table>
  <ul>
    <li class='newrow'>
      <h6>New item</h6>
      <div>
        <p>Name:</p>
        <input type='text' name='name_0' placeholder='name' />
      </div>
      <div>
        <p>Ingredients:</p>
        <input type='text' name='ingredients_0' placeholder='ingredients' />
      </div>
      <div>
        <p>Price:</p>
        <input type='text' name='price_0' placeholder='price' />
      <div>
    </li>
    <li class="edit">
      <input type="submit" value="Submit">
      <p class="add">New row</p>
    </li>
  </ul>
</form>

jQuery:

$(document).ready( function() {

  $('.newmenu').hide();
  $('.zero h3 a').click(function() {
    $('.newmenu').slideToggle();
  });

  // dynamically added rows start at row 1
  var row_number = 1;

  $('.newmenu > ul li p.add').click(function(){

    // append the fields with the row number
    $('.newmenu > ul li.edit').before("<li class='newrow'><h6>New item</h6><div><p>Name:</p><input type='text' name='name_" + row_number + "' placeholder='name' /></div><div><p>Ingredients:</p><input type='text' name='ingredients_" + row_number + "' placeholder='ingredients' /></div><div><p>Price:</p><input type='text' name='price_" + row_number + "' placeholder='price' /></li>");

    // increment row number
    row_number++;

  });

});

PHP:

if($_SERVER['REQUEST_METHOD'] == 'POST'){

    // start at row 0
    $row_number = 0;

    while(true) {

        // check if there are still fields in this row offset
        if(isset($_POST['name_' + $row_number])) {

            $status_input = $stmt = $dbh ->prepare("
               INSERT INTO menues(
                  restaurant_id,
                  title,
                  subtitle,
                  name,
                  ingredients,
                  price,
                  category,
                  upload_date) 

              VALUES
                  (:restaurant_id,:title, :subtitle, :name, :ingredients, :price, :category, NOW())
                  (:restaurant_id,:title, :subtitle, :name, :ingredients, :price, :category, NOW())
                  (:restaurant_id,:title, :subtitle, :name, :ingredients, :price, :category, NOW())
             ");
             $stmt->bindParam(":restaurant_id", $userdata[0]['user_id']);
             $stmt->bindParam(":title", $_POST['title']);
             $stmt->bindParam(":subtitle", $_POST['subtitle']);
             $stmt->bindParam(":name", $_POST['name_' . $row_number]);
             $stmt->bindParam(":ingredients", $_POST['ingredients_' . $row_number]);
             $stmt->bindParam(":price", $_POST['price_' . $row_number]);
             $stmt->bindParam(":category", $userdata[0]['category']);
             $stmt->execute();

        }

        // increment row number
        $row_number++;

    }
    else {
        // if there are no rows anymore, exit the while loop
        break;
    }
}

【讨论】:

  • 获取Parse error: syntax error, unexpected T_ELSE on the while else@rednaw
猜你喜欢
  • 2019-02-06
  • 2013-11-12
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2018-07-01
相关资源
最近更新 更多