Tartalomjegyzék
MySQLi
- Szerző: Sallai András
- Copyright © Sallai András, 2014, 2015, 2017, 2019, 2020
- Licenc: GNU Free Documentation License 1.3
- Web: https://szit.hu
Adatbázis
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
- index.php
<?php //Kapcsolódás $conn = mysqli_connect('localhost', 'dbuser', 'titok', 'dbnev'); //Kapcsolat bezárása mysqli_close($conn);
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
- index.php
<?php //Kapcsolódás $conn = mysqli_connect('localhost', 'dbuser', 'titok', 'dbnev'); //Ellenőrzés if (!$conn) { die('Hiba a kapcsolódás során: ' . mysqli_connect_error()) ; } echo 'Sikeres kapcsolódás'; //Kapcsolat bezárása mysqli_close($conn);
- index.php
<?php //Kapcsolódás $conn = mysqli_connect('localhost', 'dbuser', 'titok', 'dbnev'); //Ellenőrzés if (mysqli_connect_error()) { die('Hiba! A kapcsolódás sikertelen!') ; } echo 'Sikeres kapcsolódás'; //Kapcsolat bezárása mysqli_close($conn);
Adatbázis létrehozása
- createdb.php
<?php $user = 'erdo'; $pass = 'titok'; $host = 'localhost'; $conn = mysqli_connect($host, $user, $pass); if (!$conn) { die("Hiba a kapcsolódás során" . mysqli_connect_error()); } $sql = "create database erdo"; if (mysqli_query($conn, $sql)) { echo "Az adatbázis létrejött"; } else { echo "Hiba az adatbázis létrehozása során!"; echo mysqli_error($conn); } mysqli_close($conn);
Tábla létrehozása
- createtable.php
<?php $user = 'erdo'; $pass = 'titok'; $host = 'localhost'; $dbname = 'erdo'; $conn = mysqli_connect($host, $user, $pass, $dbname); if (!$conn) { die("Hiba a kapcsolódás során" . mysqli_connect_error()); } $sql = "create table dolgozok2 ( az int not null primary key auto_increment, vnev varchar(30), knev varchar(30), telepules varchar(30), fizetes double )"; if (mysqli_query($conn, $sql)) { echo "A tábla létrejött"; } else { echo "Hiba a tábla létrehozása során!"; echo mysqli_error($conn); } mysqli_close($conn);
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 = <<<EOT insert into termekek (nev, ar, mennyiseg) values ('áfonya', 640, 25); insert into termekek (nev, ar, mennyiseg) values ('naspolya', 890, 37) EOT; if (mysqli_multi_query($conn, $sqls)) { echo "Ok<br>"; echo mysqli_insert_id($conn) . "<br>" ; echo mysqli_affected_rows($conn) . "<br>"; }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
- insert.php
<?php $conn = mysqli_connect('localhost', 'erdo', 'titok', 'erdo'); if(!$conn) { die('Hiba a kapcsolódás sorána!' . mysqli_connect_error()); } $sql = <<<EOT insert into termekek (nev, ar, mennyiseg) values ('áfonya', 640, 25), ('naspolya', 890, 37) EOT; if (mysqli_query($conn, $sql)) { echo "Ok<br>"; echo mysqli_insert_id($conn) . "<br>" ; echo mysqli_affected_rows($conn) . "<br>"; }else { echo "Hiba! A beszúrás sikertelen"; echo mysqli_error($conn); }
Előkészített beszúrás
- prepared.php
<?php $conn = mysqli_connect('localhost', 'erdo', 'titok', 'erdo'); if(!$conn) { die('Hiba a kapcsolódás sorána!' . mysqli_connect_error()); } $sql = <<<EOT insert into termekek (nev, ar, mennyiseg) values (?, ?, ?) EOT; if ($stmt = mysqli_prepare($conn, $sql)) { $nev = 'áfonya'; $ar = 650; $mennyiseg = 48; mysqli_stmt_bind_param($stmt, "sdd", $nev, $ar, $mennyiseg); mysqli_stmt_execute($stmt); $nev = 'dió'; $ar = 450; $mennyiseg = 48; mysqli_stmt_bind_param($stmt, "sdd", $nev, $ar, $mennyiseg); mysqli_stmt_execute($stmt); error_log(mysqli_stmt_error($stmt)); mysqli_stmt_close($stmt); echo "Beszúrás vége"; } else { echo "Hiba a beszúrás során!"; }
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
- leker.php
<?php $conn = mysqli_connect('localhost', 'erdo', 'titok', 'erdo'); if(!$conn) { die('Hiba a kapcsolódás sorána!' . mysqli_connect_error()); } mysqli_set_charset($conn, "utf-8"); $sql = "select nev, ar from termekek"; $res = mysqli_query($conn, $sql); if (mysqli_num_rows($res)>0) { while($sor = mysqli_fetch_assoc($res)) { echo $sor['nev'] . " " . $sor['ar'] . "<br>"; } } 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 = <<<EOT insert into dolgozok (nev, telepules) values ("{$data['nev']}", "{$data['telepules']}") EOT;
Adatbázis kezelő függvények
- database.php
<?php require "config.php"; function insertDolgozo($conn, $data) { $sql = "insert into dolgozok (nev, telepules) VALUES (\"{$data['nev']}\", \"{$data['telepules']}\")"; $conn->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);
- config.php
<?php $db['host'] = "localhost"; $db['user'] = "username"; $db['pass'] = "titok"; $db['dbname'] = "dbnev";
Iterátor használata
<?php $conn = mysqli_connect("localhost", "user_nev", "jelszo", "db_nev"); if(mysqli_connect_errno()) { printf("A kapcsolódás siekrtelen: %s\n", mysqli_connect_error()); exit(); } $sql = "select nev, telepules from szemelyek"; foreach(mysqli_query($conn, $sql) as $row) { printf("%s %s\n", $row['nev'], $row['telepules']); } mysqli_close($conn);
Adatok kinyerése tömbként
Célunk az adatok visszanyerése tömbként. Ehhez egy olyan for ciklust írunk, aminek nincs törzs része:
<?php function getDataAsArray($conn) { $sql = "select nev, ar from termekek"; $res = mysqli_query($conn, $sql); for($datar = array(); $row = mysqli_fetch_assoc($res); $datar[] = $row); return $datar; }
$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:
<?php $con=mysqli_connect("localhost","felhasznalo","jelszó","dbnev"); // Kapcsolat ellenőrzése: if (mysqli_connect_errno()) { echo "Sikertelen kapcsolódás: " . mysqli_connect_error(); } $user = mysqli_real_escape_string($con, $_POST['user']); $name = mysqli_real_escape_string($con, $_POST['name']); $sql="insert into dolgozok (user, name) VALUES ('$user', '$name')"; if (!mysqli_query($con,$sql)) { die('Hiba: ' . mysqli_error($con)); } echo "1 rekord hozzáadva"; mysqli_close($con);
Hibakezelés
Hibákat eddig is kezeltünk, de most kifejezetten erre a célra létrehozott függvényt használunk.
<?php $conn = mysqli_connect("localhost", "user_nev", "jelszo", "db_nev"); if(mysqli_connect_errno()) { printf("A kapcsolódás siekrtelen: %s\n", mysqli_connect_error()); exit(); } $sql = "select nev, telepules from szemelyek"; if($result = mysqli_query($conn, $sql)) { while($row = mysqli_fetch_assoc($result)) { printf("%s %s\n, $row['nev'], $row['telepules']); } mysqli_free_result($result); } mysqli_close($conn);
Függelék
Adatok kérése tömbként
- leker.php
<?php $conn = connectDb(); print_r(getDataAsArray($conn)); closeDb($conn); function getDataAsArray($conn) { $sql = "select nev, ar from termekek"; $res = mysqli_query($conn, $sql); for($datar = array(); $row = mysqli_fetch_assoc($res); $datar[] = $row); return $datar; } function connectDb() { $conn = mysqli_connect('localhost', 'erdo', 'titok', 'erdo'); if(!$conn) { die('Hiba a kapcsolódás sorána!' . mysqli_connect_error()); } mysqli_set_charset($conn, "utf-8"); return $conn; } function closeDb($conn) { mysqli_close($conn); }
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'] . '<br>'; }
Példa függvényekkel
- config.php
$db['host'] = 'localhost'; $db['user'] = 'valaki'; $db['pass'] = 'titok'; $db['name'] = 'valami'; $db['port'] = '3306';
- db.php
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 = <<<EOT create table if not exists test01 ( title varchar(150), bodytext text, created varchar(100) ) EOT; return mysqli_query($conn, $sql); } function getDatas($conn) { $sql = 'select * from test01'; $res = mysqli_query($conn, $sql); $datas = array(); while($row = mysqli_fetch_assoc($res)) { array_push($datas, array($row['id'], $row['vmi'])); } return $datas; }
Tesztelés
Adott a következő projekt:
projekt01/ |--src/ | `--includes/ | `--database.php `--test/ `--testConnection.php
Teszt a projekthez:
- testConnection.php
<?php include '../src/includes/database.php'; $conn = connectDb(); if($conn) { echo "OK Connection\n"; closeDb($conn); }