在本教程中,您將學(xué)習(xí)如何使用PHP在MySQL表中插入記錄。
現(xiàn)在,您已經(jīng)了解了如何在MySQL中創(chuàng)建數(shù)據(jù)庫和表。在本教程中,您將學(xué)習(xí)如何執(zhí)行SQL查詢以將記錄插入表中。
INSERT INTO語句用于在數(shù)據(jù)庫表中插入新行。
讓我們使用帶有適當(dāng)值的INSERT INTO語句來執(zhí)行一個(gè)SQL查詢,之后我們將通過將該INSERT查詢傳遞給PHP mysqli_query()函數(shù)來執(zhí)行該INSERT查詢,以便在表中插入數(shù)據(jù)。 下面是一個(gè)示例,它通過指定first_name,last_name和email字段的值向persons表插入新行。
<?php $link = mysqli_connect("localhost", "root", "", "demo"); // 檢查連接 if($link === false){ die("錯(cuò)誤:無法連接。 " . mysqli_connect_error()); } //嘗試執(zhí)行插入查詢 $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Peter', 'Parker', 'peterparker@mail.com')"; if(mysqli_query($link, $sql)){ echo "記錄插入成功。"; } else{ echo "錯(cuò)誤:無法執(zhí)行 $sql. " . mysqli_error($link); } //關(guān)閉連接 mysqli_close($link); ?>
<?php $mysqli = new mysqli("localhost", "root", "", "demo"); //檢查連接 if($mysqli === false){ die("ERROR: Could not connect. " . $mysqli->connect_error); } //嘗試執(zhí)行插入查詢 $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Peter', 'Parker', 'peterparker@mail.com')"; if($mysqli->query($sql) === true){ echo "記錄插入成功。"; } else{ echo "錯(cuò)誤:無法執(zhí)行 $sql. " . $mysqli->error; } //關(guān)閉連接 $mysqli->close(); ?>
<?php try{ $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", ""); //將PDO錯(cuò)誤模式設(shè)置為異常 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e){ die("ERROR: Could not connect. " . $e->getMessage()); } //嘗試執(zhí)行插入查詢 try{ $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Peter', 'Parker', 'peterparker@mail.com')"; $pdo->exec($sql); echo "記錄插入成功。"; } catch(PDOException $e){ die("錯(cuò)誤:無法執(zhí)行 $sql. " . $e->getMessage()); } //關(guān)閉連接 unset($pdo); ?>
如果您還記得上一章中的內(nèi)容,則id字段標(biāo)記有AUTO_INCREMENT標(biāo)志。該修飾符告訴MySQL,如果未指定該值,則通過將前一個(gè)值增加1來自動(dòng)為該字段分配一個(gè)值。
您也可以一次通過單個(gè)插入查詢將多行插入到表中。為此,請?jiān)贗NSERT INTO語句中包括多個(gè)列值列表,其中每行的列值必須用括號(hào)括起來并用逗號(hào)分隔。
讓我們在persons表中再插入幾行,如下所示:
<?php $link = mysqli_connect("localhost", "root", "", "demo"); //檢查連接 if($link === false){ die("錯(cuò)誤:無法連接。 " . mysqli_connect_error()); } //嘗試執(zhí)行插入查詢 $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('John', 'Rambo', 'johnrambo@mail.com'), ('Clark', 'Kent', 'clarkkent@mail.com'), ('John', 'Carter', 'johncarter@mail.com'), ('Harry', 'Potter', 'harrypotter@mail.com')"; if(mysqli_query($link, $sql)){ echo "記錄添加成功。"; } else{ echo "錯(cuò)誤:無法執(zhí)行 $sql. " . mysqli_error($link); } //關(guān)閉連接 mysqli_close($link); ?>
<?php $mysqli = new mysqli("localhost", "root", "", "demo"); //檢查連接 if($mysqli === false){ die("ERROR: Could not connect. " . $mysqli->connect_error); } //嘗試執(zhí)行插入查詢 $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('John', 'Rambo', 'johnrambo@mail.com'), ('Clark', 'Kent', 'clarkkent@mail.com'), ('John', 'Carter', 'johncarter@mail.com'), ('Harry', 'Potter', 'harrypotter@mail.com')"; if($mysqli->query($sql) === true){ echo "記錄插入成功。"; } else{ echo "錯(cuò)誤:無法執(zhí)行 $sql. " . $mysqli->error; } //關(guān)閉連接 $mysqli->close(); ?>
<?php try{ $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", ""); //將PDO錯(cuò)誤模式設(shè)置為異常 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e){ die("錯(cuò)誤:無法連接。 " . $e->getMessage()); } //嘗試執(zhí)行插入查詢 try{ $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('John', 'Rambo', 'johnrambo@mail.com'), ('Clark', 'Kent', 'clarkkent@mail.com'), ('John', 'Carter', 'johncarter@mail.com'), ('Harry', 'Potter', 'harrypotter@mail.com')"; $pdo->exec($sql); echo "記錄插入成功。"; } catch(PDOException $e){ die("錯(cuò)誤:無法執(zhí)行 $sql. " . $e->getMessage()); } //關(guān)閉連接 unset($pdo); ?>
現(xiàn)在,轉(zhuǎn)到phpMyAdmin(http://localhost/phpmyadmin/),并檢查演示數(shù)據(jù)庫中的人員表數(shù)據(jù)。您會(huì)發(fā)現(xiàn)ID列的值是通過將前一個(gè)ID的值增加1來自動(dòng)分配的。
注意: SQL語句內(nèi)可以發(fā)生任意數(shù)量的換行符,但前提是任何換行符都不會(huì)破壞關(guān)鍵字,值,表達(dá)式等。
在上一節(jié)中,我們學(xué)習(xí)了如何從PHP腳本將數(shù)據(jù)插入數(shù)據(jù)庫?,F(xiàn)在,我們將看到如何將數(shù)據(jù)插入從HTML表單獲得的數(shù)據(jù)庫中。讓我們創(chuàng)建一個(gè)HTML表單,該表單可用于將新記錄插入人員表。
這是一個(gè)簡單的HTML表單,其中包含三個(gè)文本<input>字段和一個(gè)提交按鈕。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Add Record Form</title> </head> <form action="insert.php" method="post"> <p> <label for="firstName">First Name:</label> <input type="text" name="first_name" id="firstName"> </p> <p> <label for="lastName">Last Name:</label> <input type="text" name="last_name" id="lastName"> </p> <p> <label for="emailAddress">Email Address:</label> <input type="text" name="email" id="emailAddress"> </p> <input type="submit" value="Submit"> </form> </html>測試看看?/?
在上面的示例中,當(dāng)用戶單擊添加記錄HTML表單的提交按鈕時(shí),表單數(shù)據(jù)將發(fā)送到“ insert.php”文件?!?insert.php”文件連接到MySQL數(shù)據(jù)庫服務(wù)器,使用PHP $_REQUEST變量檢索表單字段,最后執(zhí)行插入查詢以添加記錄。這是我們的“ insert.php”文件的完整代碼:
<?php $link = mysqli_connect("localhost", "root", "", "demo"); //檢查連接 if($link === false){ die("ERROR: Could not connect. " . mysqli_connect_error()); } //為了安全起見,轉(zhuǎn)義用戶輸入 $first_name = mysqli_real_escape_string($link, $_REQUEST['first_name']); $last_name = mysqli_real_escape_string($link, $_REQUEST['last_name']); $email = mysqli_real_escape_string($link, $_REQUEST['email']); //嘗試執(zhí)行插入查詢 $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('$first_name', '$last_name', '$email')"; if(mysqli_query($link, $sql)){ echo "記錄添加成功。"; } else{ echo "錯(cuò)誤:無法執(zhí)行 $sql. " . mysqli_error($link); } //關(guān)閉連接 mysqli_close($link); ?>
<?php $mysqli = new mysqli("localhost", "root", "", "demo"); //檢查連接 if($mysqli === false){ die("錯(cuò)誤:無法連接。 " . $mysqli->connect_error); } //為了安全,轉(zhuǎn)義用戶輸入 $first_name = $mysqli->real_escape_string($_REQUEST['first_name']); $last_name = $mysqli->real_escape_string($_REQUEST['last_name']); $email = $mysqli->real_escape_string($_REQUEST['email']); //嘗試執(zhí)行插入查詢 $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('$first_name', '$last_name', '$email')"; if($mysqli->query($sql) === true){ echo "記錄插入成功。"; } else{ echo "錯(cuò)誤:無法執(zhí)行 $sql. " . $mysqli->error; } //關(guān)閉連接 $mysqli->close(); ?>
<?php try{ $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", ""); //將PDO錯(cuò)誤模式設(shè)置為異常 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e){ die("錯(cuò)誤:無法連接。" . $e->getMessage()); } //嘗試執(zhí)行插入查詢 try{ //CREATE PREPARE語句 $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:first_name, :last_name, :email)"; $stmt = $pdo->prepare($sql); //將參數(shù)綁定到語句 $stmt->bindParam(':first_name', $_REQUEST['first_name']); $stmt->bindParam(':last_name', $_REQUEST['last_name']); $stmt->bindParam(':email', $_REQUEST['email']); //執(zhí)行準(zhǔn)備好的語句 $stmt->execute(); echo "記錄插入成功。"; } catch(PDOException $e){ die("錯(cuò)誤:無法執(zhí)行 $sql. " . $e->getMessage()); } // Close connection unset($pdo); ?>
在下一章中,我們將擴(kuò)展此插入查詢示例,并通過實(shí)現(xiàn)準(zhǔn)備好的語句來進(jìn)一步提高安全性和性能,從而將其進(jìn)一步發(fā)展。
注意:mysqli_real_escape_string()函數(shù)轉(zhuǎn)義字符串中的特殊字符并創(chuàng)建合法的SQL字符串以提供防止SQL注入的安全性。
這是在MySQL數(shù)據(jù)庫表中插入表單數(shù)據(jù)的非常基本的示例。您可以擴(kuò)展此示例,使其更具交互性,方法是將驗(yàn)證添加到用戶輸入中,然后再將其插入數(shù)據(jù)庫表。請查看有關(guān)PHP表單驗(yàn)證的教程,以了解有關(guān)使用PHP 清理和驗(yàn)證用戶輸入的更多信息。