PHP و پایگاه داده: ثبت داده ها و دریافت آخرین ID ثبت شده

08 مرداد 1398
درسنامه درس 23 از سری آموزش PHP 7
PHP و پایگاه داده: ثبت داده ها و دریافت آخرین ID ثبت شده

ثبت داده ها در پایگاه داده PHP

پس از آنکه پایگاه داده و جدول های مربوطه را نوشتیم باید داده هایمان را وارد این جدول ها کنیم. برای نوشتن داده ها در جدول باید از دستور INSERT INTO استفاده کنیم که قالب کلی زیر را دارد:

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

نکاتی که در این آموزش رعایت خواهیم کرد عبارت اند از:

  • کوئری SQL در زبان PHP باید درون علامت quotation (علامت ") باشد. در خود زبان SQL و محیط پایگاه داده از quotation استفاده نمی کنیم اما اگر بخواهیم از SQL درون زبان PHP (مثلا یک فایل PHP) استفاده کنیم حتما باید آن را داخل quotation قرار دهیم.
  • مقادیر رشته ای در کوئری های SQL باید درون quotation قرار بگیرند.
  • مقادیر Numeric (عددی) نباید درون quotation قرار بگیرند.
  • کلمه ی NULL نباید درون quotation قرار بگیرد.

اگر یادتان باشد در قسمت قبل جدولی به نام MyGuests ساختیم که در آن پنج ستون داشته باشیم.

نکته: اگر ستونی AUTO_INCREMENT باشد یا TIMESTAMP ای که به صورت پیش فرض روی current_timesamp (مانند ستون reg_date در خود جدول ما) باشد، نیازی به وارد کردن آن در کوئری نخواهیم داشت چرا که MySQL به صورت خودکار این فیلد ها را تنظیم خواهد کرد.

در مثال های زیر داده هایی را وارد جدول MyGuests خواهیم کرد.

مثال اول: MySQLi به صورت شیء گرا

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>

مثال دوم: MySQLi به صورت رویه ای

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if (mysqli_query($conn, $sql)) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);
?>

مثال سوم: PDO

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)
    VALUES ('John', 'Doe', 'john@example.com')";
    // use exec() because no results are returned
    $conn->exec($sql);
    echo "New record created successfully";
    }
catch(PDOException $e)
    {
    echo $sql . "<br>" . $e->getMessage();
    }

$conn = null;
?>

سوال: آیا می توانیم id آخرین INSERT یا UPDATE را دریافت کنیم؟

پاسخ: بله اگر AUTO_INCREMENT باشد! برخی اوقات نیاز است که آخرین INSERT یا UPDATE ایجاد شده را پیدا کنیم بنابراین اگر بخواهیم علاوه بر وارد کردن داده ها آخرین id وارد شده را نیز بگیریم و echo کنیم، باید کدهای بالا را بدین شکل ویرایش کنیم:

مثال اول: MySQLi به صورت شیء گرا

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if ($conn->query($sql) === TRUE) {
    $last_id = $conn->insert_id;
    echo "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>

مثال دوم: MySQLi به صورت رویه ای

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    echo "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);
?>

مثال سوم: PDO

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)
    VALUES ('John', 'Doe', 'john@example.com')";
    // use exec() because no results are returned
    $conn->exec($sql);
    $last_id = $conn->lastInsertId();
    echo "New record created successfully. Last inserted ID is: " . $last_id;
    }
catch(PDOException $e)
    {
    echo $sql . "<br>" . $e->getMessage();
    }

$conn = null;
?>

INSERT چند گانه با mysqli_multi_query

MySQL می تواند با استفاده از تابع ()mysqli_multi_query چندین دستور SQL را یکجا اجرا کند. در مثال های زیر که طبق معمول به سه روش مختلف انجام داده ایم سه ردیف جدید به جدول MyGuests اضافه کرده ایم.

مثال اول: MySQLi به صورت شیء گرا

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";

if ($conn->multi_query($sql) === TRUE) {
    echo "New records created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>

نکته: حواستان باشد که در این ساختار بین دستورات مختلف SQL از ویرگول انگلیسی (comma) استفاده شده است (ویرگول فارسی ، و ویرگول انگلیسی , است).

مثال دوم: MySQLi به صورت رویه ای

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";

if (mysqli_multi_query($conn, $sql)) {
    echo "New records created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);
?>

مثال سوم: PDO

روش PDO کمی متفاوت است:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // begin the transaction
    $conn->beginTransaction();
    // our SQL statements
    $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES ('John', 'Doe', 'john@example.com')");
    $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES ('Mary', 'Moe', 'mary@example.com')");
    $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES ('Julie', 'Dooley', 'julie@example.com')");

    // commit the transaction
    $conn->commit();
    echo "New records created successfully";
    }
catch(PDOException $e)
    {
    // roll back the transaction if something failed
    $conn->rollback();
    echo "Error: " . $e->getMessage();
    }

$conn = null;
?>

امیدوارم از این قسمت لذت برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش PHP 7 توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مهران
10 فروردین 1400
جایگزینی برای last_id داریم ؟ خب اگه همزمان دو نفر باهم چیزی رو ثبت کنن این اشتباه میشه که !!!!!!!

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.