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);
}
}
}
}
答案 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();