php 循环插入,PHP PDO使用循环插入

博客内容讲述了在使用PHP的PDO进行多条记录插入数据库时遇到的问题,以及如何通过参数绑定解决这个问题。作者首先展示了原始函数,该函数在尝试在foreach循环中插入数据时失败。然后,作者分享了修复后的代码,通过准备SQL语句并在循环外预处理,成功实现了批量插入。最终的函数能够正确处理数组中的每个学生数据并将其添加到数据库。
摘要由CSDN通过智能技术生成

我在使用PDO将多个记录插入数据库时​​遇到问题.我可以成功添加单个记录,但是只要添加foreach循环,它就会失败.在阅读了许多关于此的其他SO问题后,我相信我需要“绑定”我的变量,尽管我对正确的语法完全感到困惑.

这是我创建的原始函数:

function addToDatabase () {

//Get All Variables

$timestamp = date("Y-m-d H:i:s");

$schoolName = $_SESSION['schoolName'];

$schoolStreet = $_SESSION['schoolStreet'];

$schoolCity = $_SESSION['schoolCity'];

$schoolState = $_SESSION['schoolState'];

$schoolZip = $_SESSION['schoolZip'];

$schoolContactName = $_SESSION['schoolContactName'];

$schoolContactTitle = $_SESSION['schoolContactTitle'];

$schoolContactPhone = $_SESSION['schoolContactPhone'];

$schoolCsontactEmail = $_SESSION['schoolContactEmail'];

$inputMethod = $_SESSION['inputMethod'];

$studentDataArray = $_SESSION['studentDataArray'];

$studentFirstNameField = $_SESSION['studentFirstNameField'];

$studentLastNameField = $_SESSION['studentLastNameField'];

$studentStreetField = $_SESSION['studentStreetField'];

$studentCityField = $_SESSION['studentCityField'];

$studentStateField = $_SESSION['studentStateField'];

$studentZipcodeField = $_SESSION['studentZipcodeField'];

$studentDOBField = $_SESSION['studentDOBField'];

$studentGenderField = $_SESSION['studentGenderField'];

$studentGradeField = $_SESSION['studentGradeField'];

//Connnect to Database

$host = 'myHost';

$un = 'myUsername';

$pw = 'myPassword';

$db_name = 'myTable';

try {

$conn = new PDO("mysql:host=$host;dbname=$dbName", $un, $pw);

echo 'Connected to database
';

$sql = "INSERT INTO studentData (originallyAddedOn, inputMethod, studentFirst, studentLast, studentStreet, studentCity, studentState, studentZip, studentDOB, studentGender, studentGrade, schoolName, schoolStreet, schoolCity, schoolState, schoolZip, schoolContactName, schoolContactTitle, schoolContactEmail, schoolContactPhone) VALUES (:originallyAddedOn, :inputMethod, :studentFirst, :studentLast, :studentStreet, :studentCity, :studentState, :studentZip, :studentDOB, :studentGender, :studentGrade, :schoolName, :schoolStreet, :schoolCity, :schoolState, :schoolZip, :schoolContactName, :schoolContactTitle, :schoolContactEmail, :schoolContactPhone)";

foreach ($studentDataArray as $student){

$q = $conn->prepare($sql);

echo $student[$studentFirstNameField]."
";

$q->execute(array( ':originallyAddedOn'=>$timestamp,

':inputMethod'=>$inputMethod,

':studentFirst'=>$student[$studentFirstNameField],

':studentLast'=>$student[$studentLastNameField],

':studentStreet'=>$student[$studentStreetField],

':studentCity'=>$student[$studentCityField],

':studentState'=>$student[$studentStateField],

':studentZip'=>$student[$studentZipField],

':studentDOB'=>$student[$studentDOBField],

':studentGender'=>$student[$studentGenderField],

':studentGrade'=>$student[$studentGradeField],

':schoolName'=>$schoolName,

':schoolStreet'=>$schoolStreet,

':schoolCity'=>$schoolCity,

':schoolState'=>$schoolState,

':schoolZip'=>$schoolZip,

':schoolContactName'=>$schoolContactName,

':schoolContactTitle'=>$schoolContactTitle,

':schoolContactEmail'=>$schoolContactEmail,

':schoolContactPhone'=>$schoolContactPhone));

}

// close the database connection

$dbh = null;

}

catch(PDOException $e) {

echo $e->getMessage();

}

}

$studentDataArray看起来类似于:

0 => //student 1

array

[0] => 'Joe' //First

[1] => 'Smith' //Last

[2] => '101 Main St' //Street

[3] => 'Boston' //City

[4] => 'MA' //State

[5] => '01234' //Zip

[6] => '2000-01-01' //Date of Birth

[7] => 'Male' //Gender

[8] => '12' //Grade

1 => //Student 2

array

[0] => 'Jane'

[1] => 'Smith'

[2] => '99 Main St'

[3] => 'Boston'

[4] => 'MA'

[5] => '01234'

[6] => '2000-02-02'

[7] => 'Female'

[8] => '10'

更新:对于那些感兴趣的人,这是我修复错误后的最终功能:

function addToDatabase ($dataArray) {

//Connnect to Database

$host = 'myHost';

$un = 'myUsername';

$pw = 'myPassword';

$db_name = 'myTable';

try {

$conn = new PDO("mysql:host=$host;dbname=$dbName", $un, $pw);

echo 'Connected to database
';

$sql = "INSERT INTO studentData (originallyAddedOn, inputMethod, studentFirst, studentLast, studentStreet, studentCity, studentState, studentZip, studentDOB, studentGender, studentGrade, schoolName, schoolStreet, schoolCity, schoolState, schoolZip, schoolContactName, schoolContactTitle, schoolContactEmail, schoolContactPhone) VALUES (:originallyAddedOn, :inputMethod, :studentFirst, :studentLast, :studentStreet, :studentCity, :studentState, :studentZip, :studentDOB, :studentGender, :studentGrade, :schoolName, :schoolStreet, :schoolCity, :schoolState, :schoolZip, :schoolContactName, :schoolContactTitle, :schoolContactEmail, :schoolContactPhone)";

$q = $conn->prepare($sql);

foreach ($dataArray as $student){

$a = array (':originallyAddedOn'=>$student['timestamp'],

':inputMethod'=>$student['inputMethod'],

':studentFirst'=>$student['studentFirst'],

':studentLast'=>$student['studentLast'],

':studentStreet'=>$student['studentStreet'],

':studentCity'=>$student['studentCity'],

':studentState'=>$student['studentState'],

':studentZip'=>$student['studentZip'],

':studentDOB'=>$student['studentDOB'],

':studentGender'=>$student['studentGender'],

':studentGrade'=>$student['studentGrade'],

':schoolName'=>$student['schoolName'],

':schoolStreet'=>$student['schoolStreet'],

':schoolCity'=>$student['schoolCity'],

':schoolState'=>$student['schoolState'],

':schoolZip'=>$student['schoolZip'],

':schoolContactName'=>$student['schoolContactName'],

':schoolContactTitle'=>$student['schoolContactTitle'],

':schoolContactEmail'=>$student['schoolContactEmail'],

':schoolContactPhone'=>$student['schoolContactPhone']);

if ($q->execute($a)) {

// Query succeeded.

} else {

// Query failed.

echo $q->errorCode();

}

// close the database connection

$dbh = null;

echo "Insert Complete!";

}

}

catch(PDOException $e) {

echo $e->getMessage();

}

}

使用 PHP 的 `foreach` 循环读取 JSON 数据,并将其插入数据库时,可以采用以下一些方法来防止插入数据重复: 1. 设置数据库字段的唯一性约束,例如将某个字段设置为主键或唯一索引,当插入时如果该字段的值已经存在,则会触发唯一性约束的异常,从而防止插入重复数据。 2. 在插入数据前,先进行查询,检查该数据是否已经存在于数据库中,如果存在,则不进行插入操作。 例如,可以先查询某个字段的值是否已经存在,例如: ```php // 假设 $data 是从 JSON 数据中读取出来的一条记录 $value = $data['field_name']; $sql = "SELECT COUNT(*) FROM table_name WHERE field_name = :value"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':value', $value); $stmt->execute(); $count = $stmt->fetchColumn(); if ($count == 0) { // 该记录不存在,进行插入操作 // ... } ``` 3. 可以使用 `INSERT IGNORE` 或 `INSERT ... ON DUPLICATE KEY UPDATE` 等语法进行插入操作,这些语法在插入数据时,如果遇到重复的键值,则会忽略插入或者更新已有数据。 例如,使用 `INSERT IGNORE` 语法进行插入操作: ```php // 假设 $data 是从 JSON 数据中读取出来的一条记录 $sql = "INSERT IGNORE INTO table_name (field1, field2, field3) VALUES (:val1, :val2, :val3)"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':val1', $data['field1']); $stmt->bindParam(':val2', $data['field2']); $stmt->bindParam(':val3', $data['field3']); $stmt->execute(); ``` 以上是几种常见的防止插入重复数据的方法,具体使用哪种方法,可以根据实际情况进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值