PHP数组未向数据库插入多行

Posted

技术标签:

【中文标题】PHP数组未向数据库插入多行【英文标题】:PHP array not inserting multiple rows to database 【发布时间】:2016-06-19 07:52:49 【问题描述】:

我已经创建了复杂的表格,我将尝试提供简化的示例。通过单击+ 按钮可以生成更多字段。

例如在表单中是字段:

Certificate    Date Of Issue    Date of Expire   
[         ]    [           ]    [            ]   +

通过单击+ 按钮它添加重复行(通过javascript),因此在单击+ 按钮后,表单的一部分看起来像:

NameOfVessel    TypeOfVessel       YearBuilt  
[          ]    [           ]    [            ]

NameOfVessel    TypeOfVessel       YearBuilt  
[          ]    [           ]    [            ]   +

可以根据用户需要多次单击+ 按钮。

我有这样的 html 表单:

<li>
    <ul class="column">         
        <li>
            <label for="NameOfVessel">Name of Vessel</label>
            <input id="NameOfVessel" type="text" name="NameOfVessel[]" class="field-style field-split25 align-left" placeholder="Name of Vessel" /> 
        </li>
    </ul>
</li>
<li>
    <ul class="column">         
        <li>
            <label for="TypeOfVessel">Type of Vessel</label>
            <input id="TypeOfVessel" type="text" name="TypeOfVessel[]" class="field-style field-split25 align-left" placeholder="Type of Vessel" /> 
        </li>           
    </ul>
</li>
<li>
    <ul class="column">         
        <li>
            <label for="YearBuilt">Year Built</label>
            <input id="YearBuilt" type="text" name="YearBuilt[]" class="field-style field-split25 align-left" placeholder="Year Built" />   
        </li>           
    </ul>
</li>

php 插入数据库。它应该将所有添加的行中的值插入到多个数据库表的行中,但现在它没有插入任何东西。

$UserID = get_current_user_id();
$NameOfVessel = mysqli_real_escape_string($link, $_POST['NameOfVessel']);       
$TypeOfVessel = mysqli_real_escape_string($link, $_POST['TypeOfVessel']);       
$YearBuilt = mysqli_real_escape_string($link, $_POST['YearBuilt']); 

foreach($NameOfVessel as $key=>$res) 
    $sql2 = "INSERT INTO CV_SeaServices (NameOfVessel, UserId, TypeOfVessel, YearBuilt) VALUES ('$res', '$UserId[$key]', '$TypeOfVessel[$key]', '$YearBuilt[$key]')";
    if(mysqli_query($link, $sql2))
        echo "Resume created successfully.";
     else 
        echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
    

var_dump($NameOfVessel);

我使用了var_dump,但它返回NULL。这段代码有什么问题?你有什么想法吗?

更新

我尝试过以下操作:

JS:

var noOfClicks = 0;
$(document).ready(function() 
    $(".add-row").click(function() 
        $("ul.sea-service").first().clone().appendTo(".personal-details1").append('<button class="remove">X</button>').find('input').val('');
        noOfClicks += 1;

    );
    $("body").on('click', '.remove', function() 
        $(this).closest('.sea-service').remove();
    );
);

HTML:

<input id="NameOfVessel' + noOfClicks + '" type="text" name="NameOfVessel[]" class="field-style field-split25 align-left" placeholder="Name of Vessel" />

但在这种情况下,我得到了 Id = ' + 'NameOfVessel' + noOfClicks + '。据我了解,我需要通过 javascript 进行连接,只是我无法正确实现它。

【问题讨论】:

那么 - 您的 mysqli 链接/连接可能有问题?当你var_dump($_POST['NameOfVessel']) 时你会得到什么? 【参考方案1】:

string mysqli_real_escape_string (mysqli $link, string $escapestr)

(docs)

mysqli_real_escape_string 需要一个字符串,而不是一个数组。

您应该首先循环 $_POST['NameOfVessel'] 数组并将 mysqli_real_escape_string 应用于值。其他帖子键也是如此。

假设$_POST['NameOfVessel']$_POST['TypeOfVessel']$_POST['YearBuilt'] 具有相同数量的元素,您可以执行以下操作:

$userId = $UserId[$key]; // because you're overriding `$key` below.
foreach($_POST['NameOfVessel'] as $key => $val)
    $NameOfVessel = $val;
    $TypeOfVessel = $_POST['TypeOfVessel'][$key];
    $YearBuilt    = $_POST['YearBuilt'][$key];

    $NameOfVessel = mysqli_real_escape_string($link, $NameOfVessel); 
    $TypeOfVessel = mysqli_real_escape_string($link, $TypeOfVessel); 
    $YearBuilt    = mysqli_real_escape_string($link, $YearBuilt); 

    $sql2 = "INSERT INTO CV_SeaServices 
            (NameOfVessel, UserId, TypeOfVessel, YearBuilt) 
            VALUES 
            ('$res', '$userId', '$TypeOfVessel', '$YearBuilt')";

    if(mysqli_query($link, $sql2))
        echo "Resume created successfully.";
     else 
        echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
    

要在克隆后实现 ID 的唯一性,请参阅此答案:jQuery clone and change Ids。

它需要一些适应。也许完全删除 id 会更容易。

【讨论】:

谢谢你的回答,但我有点不清楚,我应该如何正确使用$_POST['NameOfVessel']的循环? 谢谢你这几乎工作。通过单击+ 按钮添加多个字段,还添加了&lt;select&gt;&lt;/select&gt; 下拉列表,但仅从插入第一行值的下拉列表中添加。你知道为什么吗? 您的 ID 不是唯一的。刚刚注意到这一点:id="NameOfVessel" 如果您对每一行都重复了这一点,再加上通过 id 发送它们的 AJAX 调用,您会得到重叠的值。确保您的 id 是唯一的 :) 感谢您的回答,但我怎样才能实现所有 id 都变得独一无二? 你可以有一个像 var noOfClicks = 0; 这样的 js 变量,并在“添加行”按钮(或其他任何名称)上增加它。将您的初始 ID 设置为 NameOfVessel0(以及所有其他 ID)。在你javascript duplication 中,只需连接类似id="' + 'NameOfVessel' + noOfClicks + '"' 的东西,而不是id="NameOfVessel"

以上是关于PHP数组未向数据库插入多行的主要内容,如果未能解决你的问题,请参考以下文章

MySQLi - 插入多行 - 空 POST 数组

如何在php中从数据库中的数组中添加多行

php 提交多行多列的form表单

Laravel插入或更新数组,多行

数据流任务成功执行但未向 Excel 文件写入任何行

mysql 一次插入多行不同的数据