【问题标题】:Post array from HTML form, and use results to update multiple rows in a mysql table从 HTML 表单发布数组,并使用结果更新 mysql 表中的多行
【发布时间】:2012-07-27 20:35:32
【问题描述】:

所以我有这个基本的 html 表单。我的目标是将提交给此表单的值传递到 mysql 表中。

 <form action="?action=settings" method="post">
      <ul>
        <li>
           <label for="settingValue[1]">Setting 1:</label>
           <input type="text" name="settingValue[1]" id="setting1" required />
        </li>
        <li>
            <label for="settingValue[2]">Setting 2:</label><br>
            <input checked type="radio" name="settingValue[2]" value="1" />On<br>
            <input type="radio" name="settingValue[2]" value="0" />Off
         </li>
         <li>
             <input type="submit" name="saveChanges" value="Save Changes" />
         </li>
       </ul>
   </form>

我的 mysql 表只有 3 列(id、settingName、settingValue) 因此,我想通过将值存储到“settingValue”列中来使用此表单(在本例中为第 1 行和第 2 行)更新表中的多条记录。

经过一些研究,我发现最好的方法是发布一个数组(这是我在上面尝试做的),然后使用 foreach 循环遍历数组并更新表。

我想我的主要问题是弄清楚如何使用数组。因为我需要更新记录而不是创建新记录。我还需要保留 ID,以便更新相应的记录。

经过几个小时的谷歌搜索,我最好的猜测是这样做:

if ( isset( $_POST['saveChanges'])) {
    foreach($_POST['settingValue'] as $key => $settingValue )  {
        $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
        $conn->exec("UPDATE settings SET settingValue=$settingValue WHERE id=$key");
        $conn = null;
    }

但它没有产生任何结果。

【问题讨论】:

  • 尝试echo您的SQL查询并将其复制粘贴到mysql控制台。如果有错误,您会看到错误
  • + 尝试将值 SET 括在引号中 (') 或 (") UPDATE settings SET settingValue='$settingValue' WHERE id='$key'
  • 也可以试试print_r($_POST['settingValue'])print_r($_POST) 并检查数组。
  • 提示:label for= 必须指向元素的id,而不是name
  • 感谢 WouterH 的小费从来不知道!我的名字和身份证总是一样的,所以我从来不知道有什么区别......:/但现在我知道了:)

标签: php mysql html arrays forms


【解决方案1】:

$settingValue$key 放在引号中:

$conn->exec("UPDATE settings SET settingValue='$settingValue' WHERE id='$key'");

提示:将$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD ); 保持在foreach 循环之外。无需在每个循环上重复连接

【讨论】:

  • 完美!我不敢相信这是这么简单的事情!谢谢阿斯普林 :)
  • 注意,这样容易出现sql注入。您可能想要使用绑定参数。
  • 我把它装订在原版中,但把它拿出来张贴在这里。谢谢!
【解决方案2】:

总结我要添加的所有建议的解决方案。

Array keys as recordID 可以保存多条记录的参数信息。

循环更好地组织下一种方式(重用现有连接,而不是在每次迭代时重新打开):

$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD ); // opened connection
if ( isset( $_POST['saveChanges'])) // if smth. POSTed
    foreach($_POST['settingValue'] as $key => $settingValue ) // LOOPing thorugh each item
        $conn->exec("UPDATE settings SET settingValue='".$settingValue."' WHERE id='".$key."'"); // executing query using the previously opened connection

并尝试将值 SET 括在引号中 (') 或 (") UPDATE settings SET settingValue='$settingValue' WHERE id='$key'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多