← Back to PHP Course | Chapter 11: Database | Lesson 20 of 21

PHP MySQL Update Data

Data समय के साथ बदलता है -- एक user अपना email update करता है, एक order का status "pending" से "shipped" हो जाता है, किसी product की price बदलती है। UPDATE statement मौजूदा rows को in place modify करता है, specific columns को नई values में बदलते हुए, हमेशा एक WHERE clause से scoped जो exactly बताती है किन rows को बदलना है।
Syntax
php
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;

mysqli_query($conn, $sql);
mysqli_affected_rows($conn);   // how many rows changed

एक WHERE Clause के साथ Basic UPDATE

UPDATE tableName SET column = newValue WHERE condition specified column बदलता है, सिर्फ condition से match करने वाली rows पर -- UPDATE users SET status = inactive WHERE id = 5 exactly एक user का status बदलता है, बाकी सबको untouched छोड़ते हुए।

उदाहरण: Basic UPDATE with a WHERE Clause

php
<?php
// Create a new `SQLite3` instance with ':memory:', stored in `$db`
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE users (id INTEGER, status TEXT)");
$db->exec("INSERT INTO users VALUES (5, 'active')");
$db->exec("UPDATE users SET status = 'inactive' WHERE id = 5");
// Print "Updated" to the output
echo "Updated";
?>

एक साथ कई Columns Update करना

एक single UPDATE statement उन्हें commas से separate करके कई columns साथ बदल सकता है: UPDATE users SET name = ?, email = ?

WHERE id = ? एक query में एक specific user का name और email दोनों update करता है, दो अलग UPDATE statements चलाने के बजाय।

उदाहरण: Updating Multiple Columns at Once

php
<?php
// Create a new `SQLite3` instance with ':memory:', stored in `$db`
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE users (id INTEGER, name TEXT, email TEXT)");
$db->exec("INSERT INTO users VALUES (1, 'Old', '[email protected]')");
// Declare `$stmt`, set to `$db->prepare("UPDATE users SET name = :name, email = :email WHERE id = :id")`
$stmt = $db->prepare("UPDATE users SET name = :name, email = :email WHERE id = :id");
$stmt->bindValue(':name', 'Alice', SQLITE3_TEXT);
$stmt->bindValue(':email', '[email protected]', SQLITE3_TEXT);
$stmt->bindValue(':id', 1, SQLITE3_INTEGER);
$stmt->execute();
// Print "Both columns updated in one query" to the output
echo "Both columns updated in one query";
?>

कितनी Rows Update हुईं Check करना

mysqli_affected_rows($conn) report करता है कि सबसे हाल के UPDATE ने actually कितनी rows बदलीं -- यह confirm करने के लिए check करना उचित है कि एक update expected संख्या में rows से match हुआ, या यह detect करने के लिए कि एक ID बिल्कुल exist ही नहीं करती थी (0 rows affected)।

उदाहरण: Checking How Many Rows Were Updated

php
<?php
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE users (id INTEGER, status TEXT)");
$db->exec("INSERT INTO users VALUES (1, 'active')");
$db->exec("UPDATE users SET status = 'inactive' WHERE id = 1");
echo $db->changes() . " row(s) updated"; // mysqli_affected_rows($conn) equivalent
?>

किसी Value को उसकी Current Value के Relative Update करना

एक UPDATE SET clause के अंदर किसी column की अपनी current value को reference कर सकता है, जैसे UPDATE products SET stock = stock - 1 WHERE id = ?, जो मौजूदा stock count को एक से कम कर देता है -- counters, running totals, और inventory adjustments के लिए उपयोगी बिना पहले value को PHP में पढ़े।

उदाहरण: Updating a Value Relative to Its Current Value

php
<?php
// Create a new `SQLite3` instance with ':memory:', stored in `$db`
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE products (id INTEGER, stock INTEGER)");
$db->exec("INSERT INTO products VALUES (1, 10)");
$db->exec("UPDATE products SET stock = stock - 1 WHERE id = 1");
// Declare `$result`, set to `$db->query("SELECT stock FROM products WHERE id = 1")`
$result = $db->query("SELECT stock FROM products WHERE id = 1");
// Print a human-readable dump of `$result->fetchArray(SQLITE3_ASSOC)`
print_r($result->fetchArray(SQLITE3_ASSOC));
?>

एक Condition Share करने वाली कई Rows Update करना

बिल्कुल DELETE की तरह, एक UPDATE का WHERE clause एक साथ एक से ज़्यादा row match कर सकता है -- UPDATE orders SET status = expired WHERE created_at < ? एक single statement में हर पुराना order update कर देता है, हर row को individually loop करके update करने से कहीं ज़्यादा efficient।

उदाहरण: Updating Multiple Rows That Share a Condition

php
<?php
// Create a new `SQLite3` instance with ':memory:', stored in `$db`
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE orders (id INTEGER, created_at TEXT, status TEXT)");
$db->exec("INSERT INTO orders VALUES (1, '2020-01-01', 'open'), (2, '2024-01-01', 'open')");
$db->exec("UPDATE orders SET status = 'expired' WHERE created_at < '2023-01-01'");
// Print `$db->changes() . " old order(s) expired"` to the output
echo $db->changes() . " old order(s) expired";
?>
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. बिना WHERE clause के UPDATE table SET column = value चलाना, जो table की हर single row पर वह column update कर देता है।
  2. एक UPDATE की SET या WHERE values को unvalidated, unbound user input से बनाना, किसी भी दूसरे query type की तरह ही SQL injection का risk लेते हुए।
  3. किसी row की value को script में पहले पढ़े गए stale data के आधार पर update करना, किसी दूसरी process द्वारा बीच में किए गए change को overwrite करते हुए।
चैप्टर सारांश
  • UPDATE table SET col = newValue WHERE condition सिर्फ matching rows के specified columns बदलता है।
  • बिना WHERE clause के UPDATE table की हर row update कर देता है -- हमेशा double-check करें कि एक WHERE clause मौजूद है।
  • mysqli_affected_rows($conn) report करता है कि एक UPDATE ने actually कितनी rows बदलीं।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.