Ani jedno!
Váš první příklad používá funkci, která byla z PHP před lety odstraněna. mysql_query()
neexistuje a už by se neměl používat. Důvod, proč byl odstraněn, je ten, že byste místo něj měli používat připravené příkazy. Poskytují je buď rozšíření mysqli nebo PDO.
Váš druhý příklad je lepší, ale je příliš chaotický.
- Neměli byste
echo mysqli_query
. Z této funkce nelze vytisknout nic užitečného. - Zvykněte si neustále používat připravené příkazy a používejte zástupné symboly pro variabilní data. Od této chvíle jsou vaše dotazy konstantní, ale použití připravených příkazů je stále dobrou praxí pro případ, že byste později potřebovali přidat parametr.
- Nepoužívejte funkce jako
mysqli_fetch_array()
. Iterování možnosti výsledku jednu po druhé je chaotické a málokdy užitečné. - Nikdy nekontrolujte návratovou hodnotu volání mysqli. Je to zbytečné. Místo toho povolte hlášení chyb. Viz Jak získat chybovou zprávu v MySQLi?
- Vždy nastavte správnou znakovou sadu. Mělo by to být
utf8mb4
99 % času. - Dotaz SQL lze uložit do samostatné proměnné, ale jaký to má smysl? Předáte jej pouze jako argument do
query
funkce. Není třeba používat přechodnou proměnnou. - Nepoužívejte mysqli. Místo toho byste měli použít PDO. Pokud musíte použít mysqli, vytvořte pro tento účel jednoduchou obalovou funkci nebo třídu a spusťte svou obecnou funkci místo toho, abyste si pohrávali s funkcemi mysqli.
Zde je příklad, jak bych to udělal já. Nejprve povolím hlášení chyb pro mysqli, otevřu připojení a nastavím znakovou sadu. Poté deklaruji funkci, která přebírá 3 parametry a vrací pole. Prvním parametrem je připojení k databázi, které jste právě otevřeli. Druhým je váš dotaz SQL se zástupnými symboly, pokud nějaké existují. Třetí je volitelný a je to pole hodnot, které mají být svázány se zástupnými symboly jako parametry. Tato funkce funguje pro všechny druhy SQL dotazů. Zbytek kódu se stává opravdu jednoduchým.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = new mysqli("myserver.com", "test", "sunil7117", "test");
$link->set_charset('utf8mb4'); // always set the charset
/**
* Executes an SQL query on the database.
*
* @param \mysqli $mysqli
* @param string $query e.g. SELECT * FROM users WHERE username=?
* @param array $params An array of parameters to be bound in the given order to the placeholders in SQL
* @return array
*/
function prepared_query(\mysqli $mysqli, string $query, array $params = []): array {
$stmt = $mysqli->prepare($query);
if ($params) {
$stmt->bind_param(str_repeat("s", count($params)), ...$params);
}
$stmt->execute();
if ($result = $stmt->get_result()) {
return $result->fetch_all(MYSQLI_BOTH);
}
return null;
}
prepared_query($link, "UPDATE user SET email='[email protected]' WHERE email='[email protected]' LIMIT 1");
echo "<br>";
$result = prepared_query($link, "SELECT * FROM user");
echo "welcome to database<br>";
if ($result) {
$row = $result[0];
echo "my E-mail id is <strong> ".$row[1]. "</strong> and passoword is <strong>".$row[2]."</strong>";
}