Membrul echipei comandă oaspete php. Elementele de bază ale lucrului cu PHP MySqli. Ștergerea intrărilor vechi

02.04.2020 Sfat

Din cauza întreruperii sprijinului PHP MySQLîn 2011, DOP sau MySqli. Au o funcționalitate mai bună (decât MySQL) și oferă un API OOP (Object Oriented Interface). Care este mai bine este un subiect pentru alt articol, în acest articol vom încerca să înțelegem elementele de bază ale lucrului cu MySqli. Prin urmare, fără alte prelungiri, să trecem la a lua în considerare conectarea, selectarea, inserarea, actualizarea și ștergerea înregistrărilor (date/documente/informații) folosind PHP MySqli. Sper că acest articol va fi util în rezolvarea problemelor care pot apărea atunci când lucrați cu PHP MySqli.

Instalarea MySqli

Folosind versiuni PHP 5.3.0+, MySqli este disponibil implicit; pentru versiunile mai vechi, pentru a-l face disponibil, trebuie să includeți DLL-ul php_mysqli.dll în interiorul fișierului php.iniși editați php.ini prin decomentarea extensiei de linie=php_mysqli.dll. Pe Linux, MySQLIi va fi instalat automat când instalați pachetul PHP5 mysql. Mai mult informatii detaliate despre instalarea în sisteme de ferestreși Linux poate fi găsit.

Conexiune la baza de date

MySqli oferă două moduri de conectare la o bază de date: procedurală și orientată pe obiecte. Se recomandă utilizarea orientată pe obiecte. Procedural este similar cu (vechiul) MySql, deci poate fi preferabil pentru începători, dar merită să ne amintim că nu este recomandat.

PHP

//stil procedural $mysqli = mysqli_connect("gazdă","nume utilizator","parolă","nume_bază de date"); //stil orientat pe obiecte (recomandat) $mysqli = new mysqli("gazdă","nume utilizator","parolă","nume_database");

Următoarele arată cum să deschideți o conexiune la o bază de date într-o manieră orientată pe obiecte. Această metodă va fi folosită în toate exemplele de mai jos.

PHP

connect_error) ( die ("Eroare: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) ?>

Selectând (SELECT) seria rezultată ca un tablou asociativ

mysqli_fetch_assoc() : Codul de mai jos preia seria de rezultate ca matrice asociativă. Matricea returnată conține rânduri preluate din baza de date, unde numele coloanelor vor fi cheia folosită pentru a accesa datele interne. După cum se arată mai jos, datele sunt afișate ca un tabel HTML.

PHP

connect_error) ( die("Eroare: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //MySqli Select Query $results = $mysqli-> "; while($row = $results->fetch_assoc()) (printează" "; imprimare " "; imprimare " "; imprimare " "; imprimare " "; imprimare " "; imprimare ""; ) imprimare "
".$row["id"]."".$row["cod_produs"]."".$row["nume_produs"]."".$row["product_desc"]."„.$row[„preț”]”.
"; // Eliberează memoria asociată unui rezultat $results->free(); // închide conexiunea $mysqli->close(); ?>

Selectarea (SELECT) seria rezultată ca o matrice (asociativă, regulată sau ambele)

Funcția fetch_array(): returnează o matrice cu funcționalitatea combinată a mysqli_fetch_row și mysqli_fetch assoc. Această funcție este o versiune extinsă a funcției mysqli_fetch_row(); Puteți folosi fie un șir, fie numere pentru a accesa date.

PHP

connect_error) ( die("Eroare: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //MySqli Select Query $results = $mysqli->query("SELECT id, product_code, product_desc , preț DE LA produse"); imprimare " fetch_array()) ( printează " "; imprimare " "; imprimare " "; imprimare " "; imprimare " "; imprimare " "; imprimare ""; ) imprimare "
".$row["id"]."".$row["cod_produs"]."".$row["nume_produs"]."".$row["product_desc"]."„.$row[„preț”]”.
"; // Eliberează memoria asociată unui rezultat $results->free(); // închide conexiunea $mysqli->close(); ?>

Selectând (SELECT) seria de rezultate ca obiect

fetch_object() : Pentru a obține setul de rezultate ca obiect, trebuie să utilizați MySqli fetch_object() . Atributele obiectului vor afișa numele câmpurilor găsite în setul de rezultate.

PHP

connect_error) ( die("Eroare: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //MySqli Select Query $results = $mysqli->query("SELECT id, product_code, product_desc , preț DE LA produse"); imprimare " "; while($rând = $rezultate->fetch_object()) (printează" "; imprimare " "; imprimare " "; imprimare " "; imprimare " "; imprimare " "; imprimare ""; ) imprimare "
".$row->id."„.$row->cod_produs”.„.$row->nume_produs”.„.$row->product_desc.”„.$rând->preț”.
"; // închide conexiunea $mysqli->close(); ?>

Selectând (SELECT) o singură valoare

O singură valoare poate fi preluată din baza de date folosind fetch_object (metoda Cameron Spear).

PHP

connect_error) ( die("Eroare: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //funcții PHP înlănțuite $nume_produs = $mysqli->query("SELECTează numele_produsului DIN ID-ul produselor WHERE = 1")->fetch_object()->nume_produs; printeaza $nume_produs; //valoare de ieșire $mysqli->close(); ?>

Se preia (SELECT COUNT) numărul de rânduri din tabel

Uneori trebuie să știți numărul de rânduri dintr-un tabel, mai ales când numerotați paginile.

PHP

connect_error) ( die("Eroare: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //obține numărul total de înregistrări $rezultate = $mysqli->query("SELECT COUNT(* ) DE LA utilizatori"); $get_total_rows = $rezultate->fetch_row(); //deține înregistrările totale în variabila $mysqli->close(); ?>

SELECTează folosind instrucțiuni pregătite

declarații pregătite- un instrument special DBMS care vă permite să accelerați execuția secvențială a interogărilor repetate construite conform aceluiași șablon.

Una dintre caracteristicile MySqli este capacitatea de a folosi șabloane deja scrise: adică trebuie să scrieți o interogare o singură dată, după care poate fi executată de mai multe ori cu parametri diferiți. Utilizarea șabloanelor deja scrise îmbunătățește performanța pentru tabele mari și interogări complexe. Pentru a preveni introducerea codului rău intenționat, fiecare solicitare este analizată separat de server.

Codul de mai jos folosește un șablon (instrucțiune pregătită) pentru a prelua date din baza de date. Agregat ? într-o interogare SQL acționează ca un marker și va fi înlocuit cu un parametru, care la rândul său poate fi un șir, întreg, dublu sau blob. În cazul nostru, acesta este șirul $search_product.

PHP

$search_product = "PD1001"; //ID produs //creează o instrucțiune pregătită $query = "SELECT id, product_code, product_desc, price FROM products WHERE product_code=?"; $statement = $mysqli->prepare($query); //bind parametrii pentru markeri, unde (s = șir, i = întreg, d = dublu, b = blob) $statement->bind_param("s", $search_product); //execută interogarea $statement->execute(); //legați variabilele rezultat $statement-> "; //preluați înregistrările while($statement->fetch()) (printați" "; imprimare " "; imprimare " "; imprimare " "; imprimare " "; imprimare ""; ) imprimare "
".$id."„.$cod_produs”.„.$product_desc.”„.$preț”.
"; //închide conexiunea $statement->close();

Aceeași cerere cu mai mulți parametri:

PHP

$ID_căutare = 1; $search_product = "PD1001"; $query = "SELECT ID, product_code, product_desc, price FROM products WHERE ID=? AND product_code=?"; $statement = $mysqli->prepare($query); $statement->bind_param("este", $search_ID, $search_product); $statement->execute(); $statement->bind_result($id, $cod_produs, $desc_produs, $pret); imprimare " "; while($statement->fetch()) (printează" "; imprimare " "; imprimare " "; imprimare " "; imprimare " "; imprimare ""; ) imprimare "
".$id."„.$cod_produs”.„.$product_desc.”„.$preț”.
"; //închide conexiunea $statement->close();

INSEREȚI o înregistrare

Intrarea de mai jos inserează un nou rând în tabel.

PHP

real_escape_string("P1234")."""; $product_name = """.$mysqli->real_escape_string("42 inch TV")."""; $product_price = """.$mysqli->real_escape_string("600) ")."""; //MySqli Insert Query $insert_row = $mysqli->query("INSERT INTO products (product_code, product_name, price) VALUES($product_code, $product_name, $product_price)"); if($insert_row) )( print "Succes! ID-ul ultimei înregistrări inserate este: " .$mysqli->insert_id ."
"; )else( die("Eroare: (". $mysqli->errno .") ". $mysqli->eroare); ) ?>

Extrasul de mai jos inserează aceleași semnificații folosind Prepared Statements. După cum am spus deja, modelele sunt extrem de eficiente împotriva injecție SQL. Pentru exemplul dat, utilizarea lor este cea mai bună opțiune.

PHP

//valorile care urmează să fie introduse în tabelul bazei de date $product_code = "P1234"; $product_name = "TV 42 inch"; $product_price = "600"; $query = "INSERT INTO products (cod_produs, nume_produs, pret) VALORI(?, ?, ?)"; $statement = $mysqli->prepare($query); //bind parametrii pentru markeri, unde (s = șir, i = întreg, d = dublu, b = blob) $statement->bind_param("sss", $cod_produs, $nume_produs, $preț_produs); if($statement->execute())( print "Succes! ID-ul ultimei înregistrări inserate este: " .$statement->insert_id ."
"; )else( die("Eroare: (". $mysqli->errno .") ". $mysqli->eroare); ) $statement->close();

INSERT mai multe înregistrări

Inserarea mai multor rânduri simultan se face prin includerea unui rând de valori de coloană, fiecare rând de valori fiind înconjurat de paranteze și separat de celelalte printr-o virgulă. Uneori trebuie să aflați câte înregistrări au fost inserate, actualizate sau șterse, puteți utiliza mysqli_affected_rows pentru asta.

PHP

//produsul 1 $product_code1 = """.$mysqli->real_escape_string("P1")."""; $product_name1 = """.$mysqli->real_escape_string("Google Nexus")."""; $product_price1 = """.$mysqli->real_escape_string("149")."""; //produsul 2 $product_code2 = """.$mysqli->real_escape_string("P2")."""; $product_name2 = """.$mysqli->real_escape_string("Apple iPad 2")."""; $product_price2 = """.$mysqli->real_escape_string("217")."""; //produsul 3 $product_code3 = """.$mysqli->real_escape_string("P3")."""; $product_name3 = """.$mysqli->real_escape_string("Samsung Galaxy Note")."""; $product_price3 = """.$mysqli->real_escape_string("259")."""; //Inserați mai multe rânduri $insert = $mysqli->query("INSERT INTO products(product_code, product_name, price) VALUES ($product_code1, $product_name1, $product_price1), ($product_code2, $product_name2, $product_price2), ($ cod_produs3, $nume_produs3, $pret_produs3)"); if($insert)( //return totalul înregistrărilor inserate folosind mysqli_affected_rows print „Succes! Total „ .$mysqli->affected_rows .” rânduri adăugate.
"; )else( die("Eroare: (". $mysqli->errno .") ". $mysqli->eroare); )

Actualizați/Ștergeți intrările

Principiul actualizării și ștergerii înregistrărilor este același. Este suficient să înlocuiți șirul de interogare cu actualizarea sau ștergerea MySql (nu înțeleg, vedeți singur).

PHP

//MySqli Update Query $results = $mysqli->query("UPDATE products SET product_name="52 inch TV", product_code="323343" WHERE ID=24"); //MySqli Delete Query //$results = $mysqli->query("DELETE FROM products WHERE ID=24"); if($rezultate)( print "Succes! Înregistrare actualizată / ștearsă"; )else( print "Eroare: (". $mysqli->errno .") ". $mysqli->eroare; )

Actualizați folosind declarații pregătite

Un exemplu de actualizare a unei înregistrări folosind declarații pregătite este prezentat mai jos.

PHP

$product_name = "TV 52 inch"; $product_code = "9879798"; $fd_id = 24; $query = "UPDATE products SET product_name=?, product_code=? WHERE ID=?"; $statement = $mysqli->prepare($query); //bind parametrii pentru markeri, unde (s = șir, i = întreg, d = dublu, b = blob) $rezultate = $statement->bind_param("ssi", $nume_produs, $cod_produs, $id_găsește); if($rezultate)( print "Succes! Înregistrare actualizată"; )else( print "Eroare: (". $mysqli->errno .") ". $mysqli->eroare; )

Ștergerea intrărilor vechi

Toate înregistrările care au fost pe server mai mult de 1 zi sunt șterse; Puteți seta singur numărul de zile.

PHP

//MySqli Delete Query $results = $mysqli- (ACUM() - INTERVAL 1 ZI)"); if($rezultate)( tipăriți „Succes! înregistrările vechi de o zi au fost șterse"; )else( imprimați „Eroare: (". $mysqli- Concluzie

Fără îndoială, MySqli este semnificativ mai bun decât extensia standard MySql PHP, deși principiile funcționării lor sunt destul de asemănătoare. Sper că informațiile de mai sus sunt utile atunci când creați și migrați proiecte în viitor. Pentru comoditate, mai jos a fost implementată posibilitatea de a descărca fișiere exemplu. Acest lucru se poate face făcând clic pe butonul de descărcare.

Multe dintre bazele de date mai mature susțin conceptul de declarații pregătite. Ce sunt ei? Ele pot fi considerate ca un fel de șablon compilat pentru SQL-ul pe care o aplicație dorește să-l ruleze, care poate fi personalizat folosind parametri variabili. Declarațiile pregătite oferă două avantaje majore:

  • Interogarea trebuie analizată (sau pregătită) o singură dată, dar poate fi executată de mai multe ori cu aceiași parametri sau diferiți. Când interogarea este pregătită, baza de date își va analiza, compila și optimiza planul de executare a interogării. Pentru interogări complexe, acest proces poate dura suficient timp încât va încetini considerabil o aplicație dacă este nevoie să repeți aceeași interogare de mai multe ori cu parametri diferiți. Prin utilizarea unei instrucțiuni pregătite, aplicația evită repetarea ciclului de analiză/compilare/optimizare. Aceasta înseamnă că declarațiile pregătite folosesc mai puține resurse și, astfel, rulează mai rapid.
  • Parametrii instrucțiunilor pregătite nu trebuie să fie citați; driverul se ocupă automat de acest lucru. Dacă o aplicație folosește exclusiv instrucțiuni pregătite, dezvoltatorul poate fi sigur că nu va avea loc nicio injecție SQL (cu toate acestea, dacă se construiesc alte părți ale interogării). cu intrare fără escape, injecția SQL este încă posibilă).

Declarațiile pregătite sunt atât de utile încât sunt singura caracteristică pe care PDO o va emula pentru driverele care nu le acceptă. Acest lucru asigură că o aplicație va putea folosi aceeași paradigmă de acces la date, indiferent de capacitățile bazei de date.

Exemplul #1 Inserări repetate folosind instrucțiuni pregătite

Nume si a valoare pentru substituenții numiți.

$stmt = $dbh -> pregătiți ( „INSERT INTO REGISTRY (nume, valoare) VALORI (:nume, :valoare)”);
$stmt -> bindParam (":nume" , $nume );
$stmt -> bindParam (":value" , ​​​​$value );

// introduceți un rând
$nume = "unul" ;
$valoare = 1 ;
$stmt -> execute();

$nume = „două” ;
$valoare = 2 ;
$stmt -> execute();
?>

Exemplul #2 Inserări repetate folosind instrucțiuni pregătite

Acest exemplu realizează o interogare INSERT prin înlocuirea a Nume si a valoare pentru pozițional ? substituenți.

$stmt = $dbh -> pregătiți ( „INSERT INTO REGISTRY (nume, valoare) VALUES (?, ?)”);
$stmt -> bindParam(1, $nume);
$stmt -> bindParam (2, $valoare);

// introduceți un rând
$nume = "unul" ;
$valoare = 1 ;
$stmt -> execute();

// introduceți un alt rând cu valori diferite
$nume = „două” ;
$valoare = 2 ;
$stmt -> execute();
?>

Exemplul #3 Preluarea datelor folosind instrucțiuni pregătite

Exemplul #4 Apelarea unei proceduri stocate cu un parametru de ieșire

Dacă driverul bazei de date îl acceptă, o aplicație poate lega și parametrii pentru ieșire, precum și pentru intrare. Parametrii de ieșire sunt utilizați de obicei pentru a prelua valori din procedurile stocate. Parametrii de ieșire sunt puțin mai complex de utilizat decât parametrii de intrare, deoarece un dezvoltator trebuie să știe cât de mare ar putea fi un parametru dat atunci când îl leagă. Dacă valoarea se dovedește a fi mai mare decât dimensiunea sugerată de ei, apare o eroare.

$stmt = $dbh -> pregăti ("CALL sp_returns_string(?)" );
$stmt -> bindParam(1, $return_value, PDO::PARAM_STR, 4000);

// apelează procedura stocată
$stmt -> execute();

print "procedura a returnat $return_value \n" ;
?>

Exemplul #5 Apelarea unei proceduri stocate cu un parametru de intrare/ieșire

Dezvoltatorii pot specifica, de asemenea, parametri care dețin valori atât de intrare, cât și de ieșire; sintaxa este similară cu parametrii de ieșire. În acest exemplu următor, șirul „hello” este trecut în procedura stocată, iar când revine, hello este înlocuit cu valoarea returnată a procedurii.

$stmt = $dbh -> pregătiți ( „Apelați sp_takes_string_returns_string(?)”);
$valoare = "bună ziua" ;!}
$stmt -> bindParam (1 , $valoare , PDO :: PARAM_STR | PDO :: PARAM_INPUT_OUTPUT , 4000 );

// apelează procedura stocată
$stmt -> execute();

print "procedura a returnat $valoare \n" ;
?>