【问题标题】:Insert data using multidimensional array from multiple fields使用来自多个字段的多维数组插入数据
【发布时间】:2015-10-09 17:18:03
【问题描述】:

我有一个实际上是表格的表格,表格(表格)是动态的,因此表格可以包含 10 到 300 行的任何内容,

表格:

以下是输入表格的代码:

include("x.xxx");
$cxn = mysqli_connect($host,$user,$password,$dbname);
$query = "SELECT * FROM `inspjc` ORDER BY `scaffreq_id`";
$result = mysqli_query($cxn,$query)
    or die ("Couldn't execute query.");     

echo "<table align='center'><br>
<tr bgcolor='#8DB4E3'>
 <th>X</th>
 <th>Scaffold Req No</th>
 <th>Elevation</th>
 <th class='vertical'>Foundations</th>
 <th class='vertical'>Ledgers</th>
 <th class='vertical'>Face Brace</th>
 <th class='vertical'>Plan Brace</th>
 <th class='vertical'>Platforms</th>
 <th class='vertical'>Mobiles</th>
 <th class='vertical'>Uprights</th>
 <th class='vertical'>Transoms</th>
 <th class='vertical'>Transverse Braces</th>
 <th class='vertical'>Ties</th>
 <th class='vertical'>Safe Access</th>
 <th class='vertical'>Signs</th>
 <th>If Not Inspected<br>Supply a Reason</th>
</tr>";
while($row = mysqli_fetch_assoc($result))
{   
    extract($row);

    echo "<tr>\n
    <td><input type='checkbox' checked='checked' name='scaffreq_id[]' value='$scaffreq_id' /></td>\n
        <td><center>$scaffreq_id</center></td>\n
        <td><center>$level m</center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp1[]' value='y' /></center></td>\n            
        <td><center><input type='checkbox' checked='checked' name='insp2[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp3[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp4[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp5[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp6[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp7[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp8[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp9[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp10[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp11[]' value='y' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='insp12[]' value='y' /></center></td>\n
        <td><center><p><input type='text' name='insp_reason[]' maxlength='255' size='45' value='$insp_reason'></p></center></td>\n
        </tr>\n";
}
echo "</table><br>";
?>

所需的输出如下所示(简化):

x   ID    a    b    c    d    e    f    g
---------------------------------------------------
1   365   1    1    0    0    0    1    North Bay
1   211   1    0    1    1    1    1    South Bay
0   237   0    1    1    1    1    0    Boiler

x 表示 type='checkbox' 的输入类型,ID 表示其 ID 键。 提交时,我想将数据写入数据库。

我尝试了一些循环选项,但我需要循环从 php 运行而不是循环通过我的查询(这需要很长时间),尤其是选择了 300 行。

php代码的基本开销:

$ID = $_POST[ID];
$a = $_POST[a];
$b = $_POST[b];
$c = $_POST[c];
$d = $_POST[d];
$e = $_POST[e];
$f = $_POST[f];
$g = $_POST[g];

$userData = array();

foreach ($ID as $newid)
    {
    $userData[] = "('" . $newid['ID'] . "', 
        '" . $newid['a'] . "', 
        '" . $newid['b'] . "', 
        '" . $newid['c'] . "', 
        '" . $newid['d'] . "', 
        '" . $newid['e'] . "', 
        '" . $newid['f'] . "', 
        '" . $newid['g'] . "')";
    }

$query = "INSERT INTO `inspect` (`ID`,`a`,`b`,`c`,`d`,`e`,`f`,`g`) VALUES ";
$query .= implode(',',$userData);

但是,回显查询只会给我 "('0',0','0','0','0','0','0','0'),('0 '..." 但数据的数量(在括号内)作为选定的 ID 字段。

【问题讨论】:

  • 不应该是$_POST['ID'] 而不是$_POST[ID]。此外,您的代码很奇怪,您将值分配给单独的变量,然后似乎期望它们立即出现在数组中。
  • @Osuwariboy 它不应该有所作为,两者都应该工作。尽管如此,我已经回显了每个 $_POST,它们都包含正确的数据...
  • 好的,所以$newid实际上是一个包含a、b、c、d...等的数组。这在您的代码中并没有立即明确。不过,为什么要在循环之前分配值而不使用变量?
  • foreach ($ID as $key =&gt; $newid) { $userData[] = "('" . $newid . "', '" . $a[$key] . $b[$key]....
  • @splash58,您提供的循环有助于显示每一行的实际 id,但无论选择什么,所有 a-g 都设置为 1...

标签: php mysql arrays multidimensional-array


【解决方案1】:

更新

(哇,这很难):您将 HTML 表单中的所有输入字段定义为数组。您可以删除那些使它们成为数组的[],也可以在insp-复选框上使用name=insp[]。然后用var_dump($_POST) 输出你的提交,你会看到如何解析数组。

或者创建一个嵌套数组。这样的事情会有所帮助:

while($row = mysqli_fetch_assoc($result)) {

    extract($row);

    echo "<tr>\n
    <td><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][id]' /></td>\n
        <td><center>{$scaffreq_id}</center></td>\n
        <td><center>{$level} m</center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][a]' /></center></td>\n            
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][b]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][c]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][d]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][e]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][f]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][g]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][h]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][i]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][j]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][k]' /></center></td>\n
        <td><center><input type='checkbox' checked='checked' name='items[{$scaffreq_id}][insp][l]' /></center></td>\n
        <td><center><p><input type='text' name='items[{$scaffreq_id}][reason]' maxlength='255' size='45' value='Reason{$insp_reason}'></p></center></td>\n
        </tr>\n";
}

不看 HTML 表单代码就不容易提供帮助。但在我看来,$ID 很可能不是一个数组。所以使用foreach($ID as ...) 不好。相反,像这样构建你的字符串:

$query = "INSERT INTO `inspect` (`ID`,`a`,`b`,`c`,`d`,`e`,`f`,`g`) VALUES ";
$query .= "({$ID}, {$a}, {$b}, {$c}, {$d}, {$e}, {$f}, {$g})";

警告:
请注意,您的代码不安全且易受 SQL 注入攻击(请参阅this SO Q&A)。使用PDO prepared statements 而不是mysql() 函数!

【讨论】:

  • 感谢您的意见,尤其是关于 PDO 准备好的语句。当我回显上述查询时,输出如下所示:INSERT INTO inspect (ID,a,b,c,d,e,f,g ) 值(数组,数组,数组,数组,数组,数组,数组,数组,)
猜你喜欢
  • 2019-12-03
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2014-03-06
相关资源
最近更新 更多