Update pentru 2 coloane din tabel

Am acest tabel in baza de date Mysql

INSERT INTO `system_options` (`option_id`, `option_name`, `option_value`) VALUES
(1, 'system_live', '1'),
(2, 'system_message', 'Site Inchis'),
(3, 'system_title', 'Nume Site'),
(4, 'system_desc', 'Descrie'),

Vreau sa modific valorile din option_value cu ajutorul unui post PHP

$system_live = $_POST["system_live"];
$system_message = $_POST["system_message"];
$system_title = $_POST["system_title"];
$system_desc = $_POST["system_desc"];

Cum as putea face asta?

Am reusit sa fac asta pentru o singura setare

$stmt = $conn->prepare("UPDATE system_options SET option_value=:system_live WHERE option_name='system_live'");
$stmt->bindParam(':system_live', $system_live);
$stmt->execute();
$Execute = $stmt->execute();

Cum as putea actualiza cat mai simplu acest tabel?

Adică să faci SET la mai mult campuri simultan? Păi le înşiri separate prin virgulă:

UPDATE tabela SET camp1=‘valoare1’, camp2=‘valoare2’, camp3=‘valoare3’ etc

Poti sa actualizezi mai multe coloane

Pentru a înțelege mai bine codul, cred că repeți queries (eventual extragi toată interogarea într-o metodă separată, unde doar apelezi key/value, gen updateOptions('system_live', $system_live)).

Ce vrei tu se poate, dar face expresiile sunt ceva mai greu de citit pentru nivelul tău:


@bunicu9: Nu vreau să mă înțelegi greșit sau să mi-o iei în nume de rău, dar în mai multe ocazii ai lăsat impresia că prima ta oprire este DevForum. Eu unul apreciez că vrei să înveți, că încerci chestii, că faci, dar un skill important în programare este și acela de a efectua căutări eficiente.

https://www.google.com/search?q=sql+update+multiple+rows+at+once


Un prim pas în a găsi o rezolvare este a înțelege diferența dintre coloane și rânduri: coloanele sunt verticale (gândește-te la o coloană - sau stâlp - al Pantheon-ului). Rândul este orizontal, ca atunci când scrii un mesaj de „câteva rânduri”. Din INSERT-ul tău, aș zice că tu vrei să actualizezi rânduri, nu coloane.

Cam așa ar trebui să ai:

<?php
$stmt = $conn->prepare("
	UPDATE
		system_options
	SET
		option_value = (
			CASE
				WHEN option_name = 'system_live' THEN :system_live
				WHEN option_name = 'system_message' THEN :system_message
				WHEN option_name = 'system_title' THEN :system_title
				WHEN option_name = 'system_desc' THEN :system_desc
			END
		)
	WHERE
		FIND_IN_SET(
			option_name,
			'system_live, system_message, system_title, system_desc'
		)
");
$stmt->bindParam(':system_live', $system_live);
$stmt->bindParam(':system_message', $system_message);
$stmt->bindParam(':system_title', $system_title);
$stmt->bindParam(':system_desc', $system_desc);
$stmt->execute();
$Execute = $stmt->execute();

Iar dacă știi că nu sunt multe setări (rânduri) în tabelul system_options, atunci ai putea folosi:

<?php
$stmt = $conn->prepare("
	UPDATE
		system_options
	SET
		option_value = (
			CASE
				WHEN option_name = 'system_live' THEN :system_live
				WHEN option_name = 'system_message' THEN :system_message
				WHEN option_name = 'system_title' THEN :system_title
				WHEN option_name = 'system_desc' THEN :system_desc
				ELSE option_value
			END
		)
");
$stmt->bindParam(':system_live', $system_live);
$stmt->bindParam(':system_message', $system_message);
$stmt->bindParam(':system_title', $system_title);
$stmt->bindParam(':system_desc', $system_desc);
$stmt->execute();
$Execute = $stmt->execute();
1 Like

Sau, un o alta abordare, mai simpla de inteles, folosind multi_query.

<?php
$stmt = $conn->prepare("
	UPDATE system_options SET option_value = :option_value1 WHERE option_name = :option_name1;
	UPDATE system_options SET option_value = :option_value2 WHERE option_name = :option_name2;
	UPDATE system_options SET option_value = :option_value3 WHERE option_name = :option_name3;
	UPDATE system_options SET option_value = :option_value4 WHERE option_name = :option_name4;
");

$stmt->bindParam(':option_name1', 'system_live');
$stmt->bindParam(':otpion_value1', $system_live);


$stmt->bindParam(':option_name2', 'system_message');
$stmt->bindParam(':otpion_value2', $system_message);


$stmt->bindParam(':option_name3', 'system_title');
$stmt->bindParam(':otpion_value3', $system_title);


$stmt->bindParam(':option_name4', 'system_desc');
$stmt->bindParam(':otpion_value4', $system_desc);

$Execute = $stmt->multi_query();

Tinand cont de faptul ca trimiti toate query-urile dintr-o data, catre DB, cred ca nu e mare diferenta de performanta.

LE: Pe de alta parte, daca nu te intereseaza sa faci filtrari, specific, dupa fiecare valoare in parte, atunci poti lua in calcul stocarea in format JSON, a tuturor datelor. Ar fi optim.