Član tima naručuje gost php. Osnove rada s PHP MySqli. Brisanje starih unosa

02.04.2020 Savjet

Zbog prekida podrške PHP MySQL 2011. godine, ZOP odn MySqli. Imaju bolju funkcionalnost (od MySQL-a) i nude OOP (Object Oriented Interface) API. Koji je bolji je tema za drugi članak, u ovom ćemo članku pokušati razumjeti osnove rada s MySqli. Stoga, bez daljnjeg odlaganja, prijeđimo na razmatranje povezivanja, odabira, umetanja, ažuriranja i brisanja zapisa (podaci/dokumenti/informacije) pomoću PHP MySqli. Nadam se da će ovaj članak biti koristan u rješavanju problema koji se mogu pojaviti pri radu s PHP MySqli.

Instalacija MySqli

Korištenje PHP verzije 5.3.0+, MySqli je dostupan prema zadanim postavkama; za starije verzije, da bi bila dostupna, morate uključiti php_mysqli.dll DLL unutar datoteke php.ini i uredite php.ini uklanjanjem komentara iz linije extension=php_mysqli.dll. Na Linuxu, MySQLIi će se automatski instalirati kada instalirate PHP5 mysql paket. Više detaljne informacije o ugradnji u Windows sustavi i linux se može naći.

Veza s bazom podataka

MySqli nudi dva načina povezivanja s bazom podataka: proceduralni i objektno orijentirani. Preporuča se korištenje objektno orijentiranih. Procedural je sličan (starom) MySql-u, pa bi mogao biti bolji za početnike, ali vrijedi zapamtiti da se ne preporučuje.

PHP

//proceduralni stil $mysqli = mysqli_connect("host","username","password","database_name"); //objektno orijentirani stil (preporučeno) $mysqli = new mysqli("host","username","password","database_name");

Sljedeće pokazuje kako otvoriti vezu s bazom podataka na objektno orijentiran način. Ova metoda će se koristiti u svim primjerima u nastavku.

PHP

connect_error) ( die("Pogreška: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) ?>

Odabir (SELECT) rezultirajuće serije kao asocijativnog niza

mysqli_fetch_assoc() : Kod ispod dohvaća niz rezultata kao asocijativni niz. Vraćeni niz sadrži retke dohvaćene iz baze podataka, gdje će imena stupaca biti ključ koji se koristi za pristup internim podacima. Kao što je prikazano u nastavku, podaci se prikazuju kao HTML tablica.

PHP

connect_error) ( die("Pogreška: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //MySqli Select Query $results = $mysqli-> "; while($row = $results->fetch_assoc()) ( print " "; ispis " "; ispis " "; ispis " "; ispis " "; ispis " "; ispis ""; ) ispis "
".$row["id"]."".$row["product_code"]."".$row["product_name"]."".$row["product_desc"]."".$row["cijena"]."
"; // Oslobađa memoriju povezanu s rezultatom $results->free(); // zatvori vezu $mysqli->close(); ?>

Odabir (SELECT) rezultirajuće serije kao niza (asocijativnog, regularnog ili oboje)

fetch_array() funkcija: vraća niz s kombiniranom funkcionalnošću mysqli_fetch_row i mysqli_fetch assoc. Ova funkcija je proširena verzija funkcije mysqli_fetch_row(); Za pristup podacima možete koristiti niz ili brojeve.

PHP

connect_error) ( die("Pogreška: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //MySqli Select Query $results = $mysqli->query("SELECT id, product_code, product_desc , cijena OD proizvoda"); ispis" fetch_array()) ( ispis " "; ispis " "; ispis " "; ispis " "; ispis " "; ispis " "; ispis ""; ) ispis "
".$row["id"]."".$row["product_code"]."".$row["product_name"]."".$row["product_desc"]."".$row["cijena"]."
"; // Oslobađa memoriju povezanu s rezultatom $results->free(); // zatvori vezu $mysqli->close(); ?>

Odabir (SELECT) serije rezultata kao objekta

fetch_object() : Da biste dobili skup rezultata kao objekt, trebate koristiti MySqli fetch_object() . Atributi objekta prikazat će nazive polja pronađenih unutar skupa rezultata.

PHP

connect_error) ( die("Pogreška: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //MySqli Select Query $results = $mysqli->query("SELECT id, product_code, product_desc , cijena OD proizvoda"); ispis" "; while($row = $results->fetch_object()) ( print " "; ispis " "; ispis " "; ispis " "; ispis " "; ispis " "; ispis ""; ) ispis "
".$row->id."".$row->product_code."".$row->product_name."".$row->product_desc."".$row->price."
"; // zatvori vezu $mysqli->close(); ?>

Odabir (SELECT) jedne vrijednosti

Jedna se vrijednost može dohvatiti iz baze podataka pomoću fetch_object (metoda Cameron Spear).

PHP

connect_error) ( die("Pogreška: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //lančane PHP funkcije $product_name = $mysqli->query("SELECT product_name FROM products WHERE id = 1")->fetch_object()->product_name; ispis $product_name; //izlazna vrijednost $mysqli->close(); ?>

Dohvaćanje (SELECT COUNT) broja redaka u tablici

Ponekad morate znati broj redaka u tablici, posebno kada numerirate stranice.

PHP

connect_error) ( die("Pogreška: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //dohvati ukupan broj zapisa $results = $mysqli->query("SELECT COUNT(* ) OD korisnika"); $get_total_rows = $results->fetch_row(); //drži ukupne zapise u varijabli $mysqli->close(); ?>

SELECT pomoću pripremljenih izjava

pripremljene izjave- poseban DBMS alat koji vam omogućuje da ubrzate sekvencijalno izvršavanje ponavljajućih upita izgrađenih prema istom predlošku.

Jedna od značajki MySqli je mogućnost korištenja već napisanih predložaka: to jest, trebate napisati upit samo jednom, nakon čega se može izvršiti više puta s različitim parametrima. Korištenje već napisanih predložaka poboljšava performanse za velike tablice i složene upite. Kako bi se spriječio ulazak zlonamjernog koda, svaki zahtjev poslužitelj zasebno analizira.

Kod u nastavku koristi predložak (Pripremljena izjava) za dohvaćanje podataka iz baze podataka. Agregat ? u SQL upitu djeluje kao marker i bit će zamijenjen parametrom, koji zauzvrat može biti niz, cijeli broj, double ili blob. U našem slučaju, ovo je niz $search_product.

PHP

$search_product = "PD1001"; //id proizvoda //kreirajte pripremljenu izjavu $query = "SELECT id, product_code, product_desc, price FROM products WHERE product_code=?"; $statement = $mysqli->prepare($query); //parametri vezanja za markere, gdje (s = niz, i = cijeli broj, d = dvostruko, b = blob) $statement->bind_param("s", $search_product); //izvrši upit $statement->execute(); //vezivanje varijabli rezultata $statement-> "; //dohvati zapise while($statement->fetch()) ( print " "; ispis " "; ispis " "; ispis " "; ispis " "; ispis ""; ) ispis "
".$id."".$kod_proizvoda."".$product_desc."".$cijena."
"; //zatvaranje veze $statement->close();

Isti zahtjev s nekoliko parametara:

PHP

$search_ID = 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("je", $search_ID, $search_product); $izjava->izvrši(); $statement->bind_result($id, $product_code, $product_desc, $price); ispis" "; while($statement->fetch()) ( print " "; ispis " "; ispis " "; ispis " "; ispis " "; ispis ""; ) ispis "
".$id."".$kod_proizvoda."".$product_desc."".$cijena."
"; //zatvaranje veze $statement->close();

UMETNITE zapis

Unos u nastavku umeće novi red u tablicu.

PHP

real_escape_string("P1234")."""; $product_name = """.$mysqli->real_escape_string("42 inčni 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 "Uspjeh! ID posljednjeg umetnutog zapisa je: " .$mysqli->insert_id ."
"; )else( die("Pogreška: (". $mysqli->errno .") ". $mysqli->greška); ) ?>

Isječak ispod umeće ista značenja koristeći pripremljene izjave. Kao što smo već rekli, uzorci su iznimno učinkoviti protiv SQL injekcija. Za navedeni primjer, njihova je uporaba najbolja opcija.

PHP

//vrijednosti koje treba umetnuti u tablicu baze podataka $product_code = "P1234"; $product_name = "TV od 42 inča"; $product_price = "600"; $query = "INSERT INTO products (product_code, product_name, price) VALUES(?, ?, ?)"; $statement = $mysqli->prepare($query); //parametri vezanja za markere, gdje (s = niz, i = cijeli broj, d = dvostruko, b = blob) $statement->bind_param("sss", $product_code, $product_name, $product_price); if($statement->execute())( print "Uspjeh! ID zadnjeg umetnutog zapisa je: " .$statement->insert_id ."
"; )else( die("Pogreška: (". $mysqli->errno .") ". $mysqli->greška); ) $statement->close();

INSERT više zapisa

Umetanje više redaka odjednom vrši se uključivanjem reda vrijednosti stupca, pri čemu je svaki red vrijednosti okružen zagradama i odvojen od ostalih zarezom. Ponekad trebate saznati koliko je zapisa umetnuto, ažurirano ili izbrisano, za to možete koristiti mysqli_affected_rows.

PHP

//proizvod 1 $product_code1 = """.$mysqli->real_escape_string("P1")."""; $product_name1 = """.$mysqli->real_escape_string("Google Nexus")."""; $product_price1 = """.$mysqli->real_escape_string("149")."""; //proizvod 2 $product_code2 = """.$mysqli->real_escape_string("P2")."""; $product_name2 = """.$mysqli->real_escape_string("Apple iPad 2")."""; $product_price2 = """.$mysqli->real_escape_string("217")."""; //proizvod 3 $product_code3 = """.$mysqli->real_escape_string("P3")."""; $product_name3 = """.$mysqli->real_escape_string("Samsung Galaxy Note")."""; $product_price3 = """.$mysqli->real_escape_string("259")."""; //Umetni više redaka $insert = $mysqli->query("INSERT INTO products(product_code, product_name, price) VALUES ($product_code1, $product_name1, $product_price1), ($product_code2, $product_name2, $product_price2), ($ kod_proizvoda3, $naziv_proizvoda3, $cijena_proizvoda3)"); if($insert)( //vrati ukupno umetnute zapise koristeći mysqli_affected_rows ispis "Uspjeh! Ukupno " .$mysqli->affected_rows." dodani su redi.
"; )else( die("Pogreška: (". $mysqli->errno .") ". $mysqli->greška); )

Ažuriranje/brisanje unosa

Princip ažuriranja i brisanja zapisa je isti. Dovoljno je zamijeniti niz upita sa MySql update ili delete (ne razumijem, pogledajte sami).

PHP

//Upit za ažuriranje MySqli $results = $mysqli->query("UPDATE products SET product_name="52 inch TV", product_code="323343" WHERE ID=24"); //MySqli Brisanje upita //$results = $mysqli->query("DELETE FROM products WHERE ID=24"); if($results)( ispis "Uspjeh! zapis ažuriran / izbrisan"; )else( ispis "Pogreška: (". $mysqli->errno .") ". $mysqli->greška; )

Ažurirajte pomoću pripremljenih izjava

Primjer ažuriranja zapisa pomoću pripremljenih izjava prikazan je u nastavku.

PHP

$product_name = "TV od 52 inča"; $product_code = "9879798"; $find_id = 24; $query = "UPDATE products SET product_name=?, product_code=? WHERE ID=?"; $statement = $mysqli->prepare($query); //parametri vezanja za markere, gdje (s = string, i = integer, d = double, b = blob) $results = $statement->bind_param("ssi", $product_name, $product_code, $find_id); if($results)( ispis "Uspjeh! Zapis ažuriran"; )else( ispis "Pogreška: (". $mysqli->errno .") ". $mysqli->greška; )

Brisanje starih unosa

Brišu se svi zapisi koji su na poslužitelju dulje od 1 dana; Možete sami odrediti broj dana.

PHP

//MySqli Brisanje upita $results = $mysqli- (SADA() - INTERVAL 1 DAN)"); if($rezultati)( ispis "Uspjeh! izbrisani zapisi stari jedan dan"; )else( ispis "Pogreška: (". $mysqli- Zaključak

Bez sumnje, MySqli je značajno bolji od standardne MySql PHP ekstenzije, iako su principi njihovog rada dosta slični. Nadam se da će gornje informacije biti korisne pri stvaranju i migraciji projekata u budućnosti. Radi praktičnosti, u nastavku je implementirana mogućnost preuzimanja primjera datoteka. To možete učiniti klikom na gumb za preuzimanje.

Mnoge od zrelijih baza podataka podržavaju koncept pripremljenih izjava. Što su oni? Oni se mogu smatrati nekom vrstom kompajliranog predloška za SQL koji aplikacija želi pokrenuti, a koji se može prilagoditi pomoću varijabilnih parametara. Pripremljeni izvještaji nude dvije velike prednosti:

  • Upit treba samo jednom analizirati (ili pripremiti), ali se može izvršiti više puta s istim ili različitim parametrima. Kada je upit pripremljen, baza podataka će analizirati, kompilirati i optimizirati svoj plan za izvršenje upita. Za složene upite ovaj proces može oduzeti dovoljno vremena da će značajno usporiti aplikaciju ako postoji potreba za ponavljanjem istog upita mnogo puta s različitim parametrima. Korištenjem pripremljene izjave aplikacija izbjegava ponavljanje ciklusa analiza/prevođenje/optimizacija. To znači da pripremljeni izvodi koriste manje resursa i stoga se izvode brže.
  • Parametri pripremljenih izjava ne moraju biti citirani; upravljački program to automatski obrađuje. Ako aplikacija koristi isključivo pripremljene izjave, programer može biti siguran da neće doći do ubacivanja SQL-a (međutim, ako se grade drugi dijelovi upita s neizbjegnutim unosom, SQL ubacivanje je još uvijek moguće).

Pripremljene izjave su toliko korisne da su jedina značajka koju će PDO emulirati za upravljačke programe koji ih ne podržavaju. To osigurava da će aplikacija moći koristiti istu paradigmu pristupa podacima bez obzira na mogućnosti baze podataka.

Primjer #1 Ponovljeni umetci pomoću pripremljenih izjava

Ime i a vrijednost za imenovana rezervirana mjesta.

$stmt = $dbh -> pripremi ( "INSERT INTO REGISTAR (ime, vrijednost) VRIJEDNOSTI (:ime, :vrijednost)");
$stmt -> bindParam (":name" , $name );
$stmt -> bindParam (":vrijednost" , $vrijednost);

// umetnite jedan red
$name = "jedan" ;
$vrijednost = 1;
$stmt -> izvrši();

$name = "dva" ;
$vrijednost = 2;
$stmt -> izvrši();
?>

Primjer #2 Ponovljeni umetci pomoću pripremljenih izjava

Ovaj primjer izvodi upit INSERT zamjenom a Ime i a vrijednost za položajni ? rezervirana mjesta.

$stmt = $dbh -> pripremi ( "INSERT INTO REGISTAR (ime, vrijednost) VRIJEDNOSTI (?, ?)");
$stmt -> bindParam(1, $name);
$stmt -> bindParam (2, $vrijednost);

// umetnite jedan red
$name = "jedan" ;
$vrijednost = 1;
$stmt -> izvrši();

// umetnite drugi red s različitim vrijednostima
$name = "dva" ;
$vrijednost = 2;
$stmt -> izvrši();
?>

Primjer #3 Dohvaćanje podataka pomoću pripremljenih izjava

Primjer #4 Pozivanje pohranjene procedure s izlaznim parametrom

Ako upravljački program baze podataka to podržava, aplikacija također može vezati parametre za izlaz kao i za unos. Izlazni parametri obično se koriste za dohvaćanje vrijednosti iz pohranjenih procedura. Izlazni parametri malo su složeniji za korištenje od ulaznih parametara, jer programer mora znati koliko velik bi dati parametar mogao biti kada ga veže. Ako se vrijednost pokaže većom od veličine koju su predložili, javlja se pogreška.

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

// poziv pohranjene procedure
$stmt -> izvrši();

print "procedura je vratila $return_value \n" ;
?>

Primjer #5 Pozivanje pohranjene procedure s ulazno/izlaznim parametrom

Programeri također mogu specificirati parametre koji sadrže vrijednosti i ulaza i izlaza; sintaksa je slična izlaznim parametrima. U sljedećem primjeru, niz "hello" prosljeđuje se u pohranjenu proceduru, a kada se vrati, hello se zamjenjuje povratnom vrijednošću procedure.

$stmt = $dbh -> pripremi ( "CALL sp_takes_string_returns_string(?)");
$vrijednost = "zdravo" ;!}
$stmt -> bindParam (1, $vrijednost, PDO :: PARAM_STR | PDO :: PARAM_INPUT_OUTPUT, 4000);

// poziv pohranjene procedure
$stmt -> izvrši();

print "procedura je vratila $vrijednost \n" ;
?>