Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:php:php_adatbazis:mysqli

< PHP adatbázis

MySQLi

  • Szerző: Sallai András
  • Copyright © Sallai András, 2014, 2015, 2017, 2019, 2020
  • Licenc: GNU Free Documentation License 1.3

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

Ajánlott

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);
}
oktatas/programozas/php/php_adatbazis/mysqli.txt · Utolsó módosítás: 2021/12/14 22:08 szerkesztette: admin