[[oktatas:programozás:php:php adatbázis|< PHP adatbázis]]
====== MySQLi ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2014, 2015, 2017, 2019, 2020
* Licenc: GNU Free Documentation License 1.3
* Web: https://szit.hu
===== Adatbázis =====
{{:oktatas:programozas:php:php_adatbazis:php_adatbazis.png?400|}}
{{:oktatas:programozas:php:php_adatbazis:php_adatbazis_02.png?400|}}
Adatbázis létrehozása MySQL és MariaDB rendszeren:
create database dbnev
character set utf8
collate utf8_hungarian_ci;
Felhasználó létrehozása, jogokkal:
grant all privileges
on adatbázisnév.*
to felhasználónév@localhost
identified by 'titok';
===== Kapcsolódás =====
Ha az adatbázis még nem létezik, az utolsó paraméter törlendő a mysqli_connect()
függvénynél.
===== Ellenőrzés =====
===== Adatbázis létrehozása =====
===== Tábla létrehozása =====
===== Beszúrás =====
$sql = "INSERT INTO users (user, pass) VALUES ('kati', 'titok')";
if (mysqli_query($conn, $sql)) {
echo "A beszúrás sikeres";
} else {
echo "Hiba a beszúrás során";
echo mysqli_error($conn);
}
==== Beszúrt rekord azonosítója ====
$sql = "INSERT INTO users (user, pass) VALUES ('kati', 'titok')";
mysqli_query($conn, $sql)
echo mysqli_insert_id($conn);
==== Érintett sorok ====
echo mysqli_affected_rows($conn)
===== Több SQL utasítás együtt =====
$sqls = <<";
echo mysqli_insert_id($conn) . "
" ;
echo mysqli_affected_rows($conn) . "
";
}else {
echo "Hiba! A beszúrás sikertelen";
echo mysqli_error($conn);
}
A mysqli_affected_rows() a sorok érintettségéről nem ad megfelelő
információt, mert csak első SQL utasításról tájékoztat,
hasonlóan a mysqli_insert_id() is az első beszúráshoz
tartozó azonosítót adja.
===== Több rekord egyetlen insert =====
";
echo mysqli_insert_id($conn) . "
" ;
echo mysqli_affected_rows($conn) . "
";
}else {
echo "Hiba! A beszúrás sikertelen";
echo mysqli_error($conn);
}
===== Előkészített beszúrás =====
A mysqli_stmt_bind_param() függvény második paramétere a bemenő paraméterek típusai,
amiket egy-egy karakterrel adunk meg. A következő karakterek használhatók:
* i -- egész -- integer
* d -- valós -- double
* s -- szöveg -- string
* b -- BLOB
A dátum is szöveg, hiszen szövegként adjuk meg.
===== Lekérés =====
0) {
while($sor = mysqli_fetch_assoc($res)) {
echo $sor['nev'] . " " . $sor['ar'] . "
";
}
} else {
echo "Nem volt visszadott rekord";
}
A karakterkódolás beállítása elhagyható. Ha ékezetes tábla és
mezőnevekkel dolgozunk, akkor ne hagyjuk ki!
A lekérés során, hány rekordot kaptunk:
$darabszam = mysqli_num_rows($res);
===== SQL paraméterek asszociatív tömbből =====
Asszociatív tömbök önmagukban nem írhatók be karaktersorozatokba,
behelyettesítés céljából. Az asszociatív tömböt kapcsos zárójelek
közzé kell tenni:
{data['valami']}
Példa:
$sql = "insert into dolgozok (nev, telepules) values (\"{$data['nev']}\", \"{$data['telepules']}\")";
Heredoc szintaxissal:
$sql = <<
===== Adatbázis kezelő függvények =====
query($sql);
}
function dbopen() {
global $db;
$conn = new mysqli($db['host'], $db['user'], $db['pass'], $db['dbname']);
if($conn->connect_error)
die("Hiba a kapcsolódás során (" . $conn->connect_errno . ")"
. $conn->connect_error);
$conn->set_charset("utf8");
return $conn;
}
function dbclose($conn) {
$conn->close();
}
A data egy tömb. A tömböt átadjuk paraméterként, meg a megnyitott kapcsolatobjektumot:
Így hívjuk meg:
$conn = dbopen();
$data = array(
nev => $_POST['nev'],
telepules => $_POST['telepules']
);
insertDolgozo($con, $data);
===== Iterátor használata =====
===== Adatok kinyerése tömbként =====
Ajánlott
Célunk az adatok visszanyerése tömbként. Ehhez egy olyan
for ciklust írunk, aminek nincs törzs része:
$termekek = getDataAsArray($conn);
foreach($termekek as $termek) {
echo $termek['nev'] . ' ' . echo $termek['ar'];
}
===== Real escape =====
A biztonság érdekében felhasználók által bevitt adatokat
kicsit átalakítjuk:
$user = mysqli_real_escape_string($con, $_POST['user']);
Teljes példa:
* http://php.net/manual/en/mysqli.real-escape-string.php
===== Hibakezelés =====
Hibákat eddig is kezeltünk, de most kifejezetten erre a célra létrehozott függvényt
használunk.
===== Függelék =====
==== Adatok kérése tömbként ====
A hívás helyén a kapott tömböt a következő módon iteráljuk:
foreach($regList as $record) {
echo $record['nev'] . ' ' . $record['ar'] . '
';
}
==== Példa függvényekkel ====
$db['host'] = 'localhost';
$db['user'] = 'valaki';
$db['pass'] = 'titok';
$db['name'] = 'valami';
$db['port'] = '3306';
include 'config.php';
function connectDb() {
global $db;
$conn = mysqli_connect(
$db['host'],
$db['user'],
$db['pass'],
$db['name'],
$db['port']
);
if(!$conn) {
die('Hiba! A kapcsolódás sikertelen: ' .
mysqli_connect_error());
}
return $conn;
}
function closeDb($conn) {
mysqli_close($conn);
}
function createTable($conn) {
$sql = <<
==== Tesztelés ====
Adott a következő projekt:
projekt01/
|--src/
| `--includes/
| `--database.php
`--test/
`--testConnection.php
Teszt a projekthez: