【问题标题】:retrieving post values from form with dynamic element names使用动态元素名称从表单中检索帖子值
【发布时间】:2013-11-27 08:14:50
【问题描述】:

我正在尝试从元素名称基于记录集中的值的表单中检索帖子值。这是表格:

$recordID = $_GET["recordID"];
$colour_result = mysqli_query($con,"SELECT colour_variation.*, colours.* FROM colour_variation INNER JOIN colours ON colour_variation.colour_id=colours.colour_id WHERE product_code='$recordID'");
while($colour_row = mysqli_fetch_array($colour_result))
  {
 ?> 
<tr><td valign="middle"><img src="resources/images/colours/<?php echo $colour_row['colour_image']; ?>" width="35" height="35"></td><td width="100"><?php echo $colour_row['colour_name']; ?></td>
    <td><center><?php if($colour_row['xs'] !== '') { echo('<input type="text" size="2" name="xs_<?php echo $colour_row[colour_name]; ?>" id="xs_<?php echo $row[colour_name]; ?>" placeholder="Qty">');
     } else { echo(''); } ?> </center></td>
    <td><center><?php if($colour_row['s'] !== '') { echo('<input type="text" size="2" name="s_<?php echo $colour_row[colour_name]; ?>" id="s_<?php echo $row[colour_name]; ?>" placeholder="Qty">');
     } else { echo(''); } ?> </center></td>
    <td><center><?php if($colour_row['m'] !== '') { echo('<input type="text" size="2" name="m_<?php echo $colour_row[colour_name]; ?>" id="m_<?php echo $row[colour_name]; ?>" placeholder="Qty">');
     } else { echo(''); } ?> </center></td>
    <td><center><?php if($colour_row['l'] !== '') { echo('<input type="text" size="2" name="l_<?php echo $colour_row[colour_name]; ?>" id="l_<?php echo $row[colour_name]; ?>" placeholder="Qty">');
     } else { echo(''); } ?> </center></td>
    <td><center><?php if($colour_row['xl'] !== '') { echo('<input type="text" size="2" name="xl_<?php echo $colour_row[colour_name]; ?>" id="xl_<?php echo $row[colour_name]; ?>" placeholder="Qty">');
     } else { echo(''); } ?> </center></td>
    <td><center><?php if($colour_row['xxl'] !== '') { echo('<input type="text" size="2" name="xxl_<?php echo $colour_row[colour_name]; ?>" id="xxl_<?php echo $row[colour_name]; ?>" placeholder="Qty">');
     } else { echo(''); } ?> </center></td>
    <td><center><?php if($colour_row['xxxl'] !== '') { echo('<input type="text" size="2" name="xxxl_<?php echo $colour_row[colour_name]; ?>" id="xxxl_<?php echo $row[colour_name]; ?>" placeholder="Qty">');
     } else { echo(''); } ?> </center></td>
    <td><center><?php if($colour_row['one_size'] !== '') { echo('<input type="text" size="2" name="one_size_<?php echo $colour_row[colour_name]; ?>" id="one_size_<?php echo $row[colour_name]; ?>" placeholder="Qty">');
     } else { echo(''); } ?> </center></td>

    </tr>
    <?php } ?>
</table>
<input type="hidden" name="product_code" value="<?php echo $row_products['product_code']; ?>" >

我试过这个把它们弄出来,但它不起作用:

<?php 
$product_code=$_POST["product_code"];
 foreach ($_POST as $key => $value) {
        if (substr($key, 0, 2) == "xs_") {
            $colour_name[str_replace("xs_", "", $key)] = $value;
        }
        echo $key;
        echo '<br />';
        echo $value;
    }


?>

每个产品可以有任意数量的颜色。非常感谢您对根据每种颜色/尺寸选择的数量在下一页上显示值的任何帮助。

谢谢

【问题讨论】:

  • WHERE product_code='$recordID'" 很危险,逃出你的sql数据。
  • 问题是您的 PHP 生成了您的输入字段...您在 echo 中有回显,这将不起作用,您可能会在检查 HTML 源代码时看到它。这些名字可能不正确。您解析发布值的代码看起来没问题。

标签: php mysql html forms


【解决方案1】:

首先我会改变

name="s_<?php echo $colour_row[colour_name]; ?>"

等到

name="attributes[s_<?php echo $colour_row[colour_name]; ?>]"

并使用下面的PHP

if( !empty($_POST['attributes']) ) {
    foreach( $_POST['attributes'] as $sKey => $iQty ) {
        var_dump( $sKey );
        var_dump( $iQty );
    }
} else {
    die( 'Just for debuging. attributes-array was empty' );
}

甚至更好

使用

name="attributes[xxl][color]" eg. name="attributes[xxl][<?php echo $colour_row[colour_name]; ?>]"

if( !empty($_POST['attributes']) ) {
    foreach( $_POST['attributes'] as $sSize => $aData ) {
        var_dump( $sSize );
        var_dump( $aData );
    }
}

【讨论】:

  • 我正在写一个答案,但你的更好。 +1
  • 感谢大家的快速回复。当我尝试上述方法时,我得到了这个: string(1) "s" array(1) { [" string(1) "3" } string(1) "m" array(1) { [" string(0) " " } string(1) "l" array(1) { [" string(1) "3" } string(2) "xl" array(1) { [" string(0) "" } string(3) " xxl" array(1) { [" string(0) "" } string(2) "xs" array(1) { [" string(0) "" } 我怎样才能让它显示字段的名称?再次非常感谢:)
  • 你能运行var_dump( $_POST['attributes'] )并发布结果吗?
【解决方案2】:

好的,我现在使用以下代码将它显示为第二页上的列表:

<td><center><?php if($colour_row['xxl'] !== '') { echo('<input type="text" size="2" name="xxl_' . $colour_row['colour_name'] . '" placeholder="Qty">');
 } else { echo(''); } ?> </center></td>

然后:

<?php 
$product_code=$_POST["product_code"];

foreach($_POST as $key=>$value)
{
  echo "$key=$value";
  echo "<br />";
}
?>

在第二页。

谢谢大家的帮助,你们的建议让我走上了正轨,非常感谢。

【讨论】:

    【解决方案3】:

    你把 PHP 代码放在一个字符串中,它不会被 PHP 以这种方式解析:

    echo '<input name="xs_<?php echo $colour_row[colour_name]; ?>">';
    

    这应该像这样连接起来:

    echo '<input name="xs_' . $colour_row[colour_name] . '">';
    

    同样的道理

    echo '<input id="xs_<?php echo $row[colour_name]; ?>">';
    

    需要转换为:

    echo '<input id="xs_' . $row[colour_name] . '">';
    

    还有可能“$row”在输入字段的 id 属性中必须是“$colour_row”吗?

    还有一些其他明显的改进需要做,但这些超出了您的问题范围。


    我正在关闭我的 Netbeans,发现它仍然在那里,我希望它有用(不能 100% 保证开箱即用):

    php 的形式会变成:

    <?php
    $recordID = $_GET["recordID"];
    
    // I adjusted the query somewhat.
    // The colours tabel is joined with a USING() command
    // The recordId is escaped
    $colour_result = mysqli_query($con, "
        SELECT colour_variation.*, colours.*
        FROM colour_variation INNER JOIN colours USING(colour_id)
        WHERE product_code = '". mysqli_escape_string($con, $recordID)."'
    ");
    
    // I'm using an alternative syntax for the while control structure ( I am
    // using a colon instead of braces ):
    while ($colour_row = mysqli_fetch_array($colour_result)): ?>
        <tr>
            <td valign="middle"><img src="resources/images/colours/<?php echo $colour_row['colour_image']; ?>" width="35" height="35"></td>
            <td width="100"><?php echo $colour_row['colour_name']; ?></td>
            <!-- I'm using an alternative syntax for the if control structures here -->
            <!-- I also left out the else, since it did not print anything -->
            <!-- I used an array for the name notation, to easily read out the data -->
            <td><center><?php if ($colour_row['xs'] !== ''): ?><input type="text" size="2" name="quantity[<?php echo $colour_row['colour_name']; ?>][xs]" placeholder="Qty"><?php endif; ?> </center></td>
            <td><center><?php if ($colour_row['s'] !== ''): ?><input type="text" size="2" name="quantity[<?php echo $colour_row['colour_name']; ?>][s]" placeholder="Qty"><?php endif; ?> </center></td>
            <td><center><?php if ($colour_row['m'] !== ''): ?><input type="text" size="2" name="quantity[<?php echo $colour_row['colour_name']; ?>][m]" placeholder="Qty"><?php endif; ?> </center></td>
            <td><center><?php if ($colour_row['l'] !== ''): ?><input type="text" size="2" name="quantity[<?php echo $colour_row['colour_name']; ?>][l]" placeholder="Qty"><?php endif; ?> </center></td>
            <td><center><?php if ($colour_row['xl'] !== ''): ?><input type="text" size="2" name="quantity[<?php echo $colour_row['colour_name']; ?>][xl]" placeholder="Qty"><?php endif; ?> </center></td>
            <td><center><?php if ($colour_row['xxl'] !== ''): ?><input type="text" size="2" name="quantity[<?php echo $colour_row['colour_name']; ?>][xxl]" placeholder="Qty"><?php endif; ?> </center></td>
            <td><center><?php if ($colour_row['xxxl'] !== ''): ?><input type="text" size="2" name="quantity[<?php echo $colour_row['colour_name']; ?>][xxxl]" placeholder="Qty"><?php endif; ?> </center></td>
            <td><center><?php if ($colour_row['one_size'] !== ''): ?><input type="text" size="2" name="quantity[<?php echo $colour_row['colour_name']; ?>][one_size]" placeholder="Qty"><?php endif; ?> </center></td>
        </tr>
    <?php endwhile; ?>
    </table>
    <input type="hidden" name="product_code" value="<?php echo $colour_row_products['product_code']; ?>" >
    

    接收端会是这样的:

    <?php
    
        $iProductCode = $_POST['product_code'];
    
        foreach($_POST['quantity'] as $sColor => $aColourQuantityData) {
            foreach($aColourQuantityData as $sSize => $iQuantity) {
                echo "Product #$iProductCode, colour $sColor, size $sSize: $iQuantity pieces<br>";
            }
        }
    
    ?>
    

    【讨论】:

    • 他不需要,因为他正在使用结束括号“?>”。不过会更漂亮。
    • @niclas-larsson:他做到了!但后来他使用:&lt;?php if($colour_row['xs'] !== '') { echo('&lt;input type="text" size="2" name="xs_&lt;?php echo $colour_row[colour_name]; ?&gt;" id="xs_&lt;?php echo $row[colour_name]; ?&gt;" placeholder="Qty"&gt;'); } else { echo(''); } ?&gt;。那里和另一个 对中有一个回声。哪个没有被解析。
    • 我现在有它:
      '); } 其他 { 回声(''); } ?>
      名称现在可以在视图源中正确显示,但是在下一页检索值时仍然遇到问题。顺便说一句,他是个女人,哈哈:)
    • 非常抱歉!我应该被 MsKazza 的女士知道......!您介意编辑您的问题以反映您的更改吗?那么我们可以从那里为您提供帮助吗?
    • 我更新了我的答案,提出了如何更改表单的建议。请注意,这不是这样做的方法,还有很多需要改进的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2014-10-24
    • 1970-01-01
    相关资源
    最近更新 更多