【问题标题】:PHP: form select box doesn't write changed selection to DBPHP:表单选择框不会将更改的选择写入数据库
【发布时间】:2009-07-08 18:04:17
【问题描述】:

好的,所以我有一个设置为预加载数据库记录以进行编辑的表单,如果您将 ?edit=1 添加到 url,它将加载记录 #1 以在表单中进行编辑。我有一个这样的盒子-

<select class="field select addr">
  <option value="no"<?php if($row['has_amenities'] == "no") {echo ' selected=\"selected\"'; } ?>>No</option>
  <option value="yes"<?php if($row['has_amenities'] == "yes") {echo     'selected=\"selected\"'; } ?>>Yes</option>
</select>

现在,假设 $row['has_amenities'] 是“是”,所以当表单加载时,选择框显示“是”。

但是,如果我将选择框更改为“否”并单击“保存”,它不会将“否”写入数据库,但它确实会清除该记录的“是”。

我做错了什么?

这是更新代码--

    $sql = "UPDATE venues SET microsite_title = '$_POST[microsite_title]', 
microsite_city_title = '$_POST[microsite_city_title]', logo = '$_POST[logo]', photo1 = 
'$_POST[photo1]', photo2 = '$_POST[photo2]', photo3 = '$_POST[photo3]', photo4 = 
'$_POST[photo4]', photo5 = '$_POST[photo5]', photo6 = '$_POST[photo6]', photo7 = 
'$_POST[photo7]', photo8 = '$_POST[photo8]', website_primary = '$_POST[website_primary]', 
website_secondary = '$_POST[website_secondary]', paragraph_1_title = 
'$_POST[paragraph_1_title]', paragraph_1 = '$_POST[paragraph_1]', paragraph_2_title = 
'$_POST[paragraph_2_title]', paragraph_2 = '$_POST[paragraph_2]', paragraph_3_title = 
'$_POST[paragraph_3_title]', paragraph_3 = '$_POST[paragraph_3]', paragraph_4_title = 
'$_POST[paragraph_4_title]', paragraph_4 = '$_POST[paragraph_4]', paragraph_5_title = 
'$_POST[paragraph_5_title]', paragraph_5 = '$_POST[paragraph_5]', paragraph_6_title = 
'$_POST[paragraph_6_title]', paragraph_6 = '$_POST[paragraph_6]', top10_1 = 
'$_POST[top10_1]', top10_2 = '$_POST[top10_2]', top10_3 = '$_POST[top10_3]', top10_4 = 
'$_POST[top10_4]', top10_5 = '$_POST[top10_5]', top10_6 = '$_POST[top10_6]', top10_7 = 
'$_POST[top10_7]', top10_8 = '$_POST[top10_8]', top10_9 = '$_POST[top10_9]', top10_10 = 
'$_POST[top10_10]', top10_locale = '$_POST[top10_locale]', contact_title = 
'$_POST[contact_title]', contact_street_addr = '$_POST[contact_street_addr]', 
contact_street_addr2 = '$_POST[contact_street_addr2]', contact_city = 
'$_POST[contact_city]', contact_state = '$_POST[contact_state]', contact_zip = 
'$_POST[contact_zip]', contact_phone = '$_POST[contact_phone]', contact_tollfree = 
'$_POST[contact_tollfree]', latitude = '$_POST[latitude]', longitude =     '$_POST[longitude]', 
testimonial = '$_POST[testimonial]', sidebar_title = '$_POST[sidebar_title]', 
sidebar_content = '$_POST[sidebar_content]', has_amenities = '$_POST[has_amenities]' 
WHERE id = '$_POST[query]'";

另外,我知道不先清理它们就写入 $_POST 值不是一个好主意,但这是防火墙等后面的内部表单。我会在它工作后稍后清理它:o)

谢谢!

【问题讨论】:

  • 仅供参考,在行首放4个空格进行代码格式化。

标签: php mysql select


【解决方案1】:

看起来

【讨论】:

    【解决方案2】:

    将 $_POST[] 的所有实例包装在 {}(大括号)中,使其看起来像这样

    '{$_POST['key']}'
    

    当 $_POST 在双引号字符串中时,大括号需要强制 PHP 将其作为变量进行评估。

    另外,像这样引用你的 $_POST 数组键

    $_POST['key']
    

    即使 $_POST[key] 通常会起作用,您也想养成这样的习惯。 PHP 将 key 视为一个常量,如果它未定义,它会自动转换为字符串“key”,以便您获得预期的行为。

    但是,如果 key 已经作为常量存在(通过 define())函数,您将获得key 常量,这不是你想要的。

    看看Array do's and don'ts 部分。

    【讨论】:

      【解决方案3】:

      尝试用大括号将数组变量包裹起来,如下所示:

      '$_POST[paragraph_3]' = '{$_POST[paragraph_3]}'
      

      【讨论】:

        【解决方案4】:

        您需要为此选择标签指定一个名称。我还看到您正在用反斜杠转义双引号,这是不必要的(它实际上会使用 \" 所以输出看起来像:selected=\"selected\" 这是错误的 html)。

        试试这个:

        <select name="has_amenities" class="field select addr">
          <option value="no"<?php if($row['has_amenities'] == "no") {echo ' selected="selected"'; } ?>>No</option>
          <option value="yes"<?php if($row['has_amenities'] == "yes") {echo     'selected="selected"'; } ?>>Yes</option>
        </select>
        

        您的 SQL 语句将按原样工作,但如果用户输入单引号,则不会破坏语句...可能会导致巨大的安全漏洞。在 google 上查看“SQL 注入”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-28
          • 1970-01-01
          相关资源
          最近更新 更多