PDO在单个查询中插入多行

时间:2019-05-17 11:33:50

标签: php sql arrays pdo insert

im试图将多个php数组放入插入语句并将其放入sql数据库中。我在编程方面没有太多经验,所以我尝试了一下。但是您不能将php数组绑定到值,因此它会提供null。我该如何解决。

$ voornamen,$ geslachten,$ achternamen,$ geboortedata是四个单独的php数组,其中包含多个用户名,生日,姓氏等数据。

要插入的php代码:

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace CaptureListEx
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<string> listViewItem { get; set; } = new ObservableCollection<string>();
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;

            for(int i = 0; i <= 150; i++)
            {
                string temp = "This is item" + i;
                listViewItem.Add(temp);
            }
        }

        private void Capture_Click(object sender, RoutedEventArgs e)
        {
            SaveFileDialog dlg = new SaveFileDialog()
            {
                DefaultExt = ".jpg",
                Filter = "JPG image (*.jpg)|*.jpg|All files (*.*)|*.*"
            };
            Nullable<bool> result = dlg.ShowDialog();
            if (result == false) return;
            if (File.Exists(dlg.FileName) && new FileInfo(dlg.FileName).Length != 0)
                File.Delete(dlg.FileName);

            double actualWidth = ListViewCtrl.ActualWidth;
            ListViewCtrl.Measure(new System.Windows.Size(Double.PositiveInfinity, Double.PositiveInfinity));
            ListViewCtrl.Arrange(new Rect(0, 0, actualWidth, ListViewCtrl.DesiredSize.Height));
            double actualHeight = ListViewCtrl.ActualHeight;

            RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)ListViewCtrl.ActualWidth, (int)ListViewCtrl.ActualHeight, 96, 96, PixelFormats.Pbgra32);

            renderTarget.Render(ListViewCtrl);

            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(renderTarget));

            using (System.IO.FileStream stream = new System.IO.FileStream(dlg.FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write))
            {
                encoder.Save(stream);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

请考虑以下内容:

  • 您的数组必须具有相等数量的元素

  • 变量$query从未使用,将其更改为$stmt

  • 您有四个列名,但SQL语句中有六个值

  • 将数组项传递给binValue(),而不是数组

示例:

<?php
$stmt = $conn->prepare(
    "INSERT INTO ReserveerCursusCursisten 
        (Geslacht, Achternaam, Voorletters, Geboortedatum) 
    VALUES 
        (:geslachten, :achternamen, :voornamen, :geboortedata)
");
for($i = 0; $i < count($achternamen); $i++)
{
    $stmt->bindValue(':geslachten', $geslachten[$i]);
    $stmt->bindValue(':achternamen', $achternamen[$i]);
    $stmt->bindValue(':voornamen', $voornamen[$i]);
    $stmt->bindValue(':geboortedata', $geboortedata[$i]);
    if ($stmt->execute() === false) {
        echo "query is niet gelukt";
    } else {
        echo "query is gelukt";
    }
}
?>

注意:

您可以跳过bindValue()并将参数传递给execute()。在这种情况下,所有参数都视为字符串(PDO::PARAM_STR,而使用bindValue()则可以定义参数数据类型(PDO::PARAM_*常量之一)。

<?php
$stmt = $conn->prepare(
    "INSERT INTO ReserveerCursusCursisten 
        (Geslacht, Achternaam, Voorletters, Geboortedatum) 
    VALUES 
        (:geslachten, :achternamen, :voornamen, :geboortedata)
");
for ($i = 0; $i < count($achternamen); $i++)
{
    $params = array($geslachten[$i], $achternamen[$i], $voornamen[$i], $geboortedata[$i]);
    if ($stmt->execute($params) === false) {
        echo "query is niet gelukt";
    } else {
        echo "query is gelukt";
    }
}
?>

有关准备好的语句的PHP文档的一部分:

  

为以下语句调用PDO :: prepare()和PDOStatement :: execute()   将使用不同的参数值多次发出   通过允许驱动程序来优化应用程序的性能   协商查询计划的客户端和/或服务器端缓存,以及   元信息。另外,调用PDO :: prepare()和   PDOStatement :: execute()有助于通过以下方式防止SQL注入攻击   无需手动引用和转义参数。

答案 1 :(得分:0)

这是构建查询的方法:首先构建整个SQL,然后将值绑定到每个列和行:

$query = "INSERT INTO ReserveerCursusCursisten 
(Geslacht, Achternaam, Voorletters, Geboortedatum) VALUES ";

$subqueries = [];

for($ii=0; $ii< count($geslachten);$ii++) {
    $subqueries []="(:ges$ii,:ach$ii,:voo$ii,:geb$ii)";
}

$query .= implode(",", $subqueries);

$stmt = $conn->prepare($query);

for($ii=0; $ii< count($geslachten);$ii++) {
    $stmt->bindValue(":ges$ii", $geslachten[$ii]);
    $stmt->bindValue(":ach$ii", $achternamen[$ii]);
    $stmt->bindValue(":voo$ii", $voornamen[$ii]);
    $stmt->bindValue(":geb$ii", $geboortedata[$ii]);
}
$stmt->execute();