[[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: