MySQLi

MySQLi -tillägget ( MySQL Improved) är en relationsdatabasdrivrutin som används i PHP- skriptspråket för att tillhandahålla ett gränssnitt med MySQL -databaser .

Det finns tre huvudsakliga API-alternativ när du överväger att ansluta till en MySQL-databasserver:

  • PHPs MySQL-tillägg
  • PHPs MySQLi-tillägg
  • PHP-dataobjekt (PDO)

PHP-koden består av en kärna, med valfria tillägg till kärnfunktionaliteten. PHPs MySQL-relaterade tillägg, såsom MySQLi-tillägget och MySQL-tillägget, implementeras med hjälp av PHP-tilläggsramverket. En tillägg exponerar vanligtvis ett API för PHP-utvecklaren, så att dess faciliteter kan användas programmatiskt. Vissa tillägg som använder PHP-tilläggsramverket exponerar dock inte ett API för PHP-utvecklaren.

PDO MySQL-drivrutinstillägget, till exempel, exponerar inte ett API för PHP-utvecklaren, utan tillhandahåller ett gränssnitt till PDO-lagret ovanför det.

MySQLi är en förbättrad version av den äldre PHP MySQL-drivrutinen, som erbjuder olika fördelar.

Författarna till PHP-skriptspråket rekommenderar att du använder MySQLi när de hanterar MySQL-serverversioner 4.1.3 och nyare (utnyttjar ny funktionalitet).

Tekniska detaljer

MySQLi-tillägget ger olika fördelar med avseende på sin föregångare, varav de mest framträdande (enligt PHP-webbplatsen) är:

Jämförelse av funktioner

PHPs MySQLi-tillägg SUB PHPs MySQL-tillägg
PHP-version introducerad 5.0 5.0 före 3.0
Ingår i PHP 5.x Ja Ja Ja
Ingår i PHP 7.x Ja Ja Nej
Utvecklingsstatus Aktiv utveckling Aktiv utveckling från och med PHP 5.3
Utfasad från och med PHP 5.5 Borttagen i PHP 7.0
Rekommenderas av MySQL för nya projekt Ja - föredraget alternativ Ja Nej
API stöder teckenuppsättningar Ja Ja Nej
API stöder förberedda uttalanden på serversidan Ja Ja Nej
API stöder förberedda uttalanden på klientsidan Nej Ja Nej
API stöder lagrade procedurer Ja Ja Nej
API stöder flera uttalanden Ja Mest Nej
Stöder alla MySQL 4.1+-funktioner Ja Mest Nej

Startguide

Dubbelt gränssnitt

MySQLi-tillägget har ett dubbelt gränssnitt - det stöder både procedurmässiga och objektorienterade programmeringsparadigm.

Användare som migrerar från det gamla MySQL-tillägget kanske föredrar det procedurmässiga gränssnittet. Det förfarandemässiga gränssnittet liknar det för den gamla MySQL-tillägget. I många fall skiljer sig funktionsnamnen endast med prefix. Vissa MySQLi-funktioner tar ett anslutningshandtag som sitt första argument, medan matchande funktioner i det gamla MySQL-gränssnittet tog det som ett valfritt sista argument.

Nya och gamla inbyggda funktionsanrop


     
   
 

    

   
 
 <?php  $mysqli  =  mysqli_connect  (  "example.com"  ,  "användare"  ,  "lösenord"  ,  "databas"  );  $result  =  mysqli_query  (  $mysqli  ,  "SELECT * FROM myDatabase" )  ;  echo  mysqli_num_rows  (  $result  );  $mysql  =  mysql_connect  (  "example.com"  ,  "användare"  ,  "lösenord"  );  mysql_select_db  (  "databas"  );  $res  =  mysql_query  (  "SELECT * FROM myDatabase"  ,  $mysql  );  echo  mysql_num_rows  (  $result  );  ?> 

Anslutningar

MySQL-servern stöder användningen av olika transportlager för anslutningar. Anslutningar använder TCP/IP, Unix-domänsockets eller Windows namngivna pipes.

Värdnamnet localhost har en speciell betydelse. Det är bundet till användningen av Unix-domänsockets. Det är inte möjligt att öppna en TCP/IP-anslutning med värdnamnet localhost du måste använda 127.0.0.1 istället.

Exempel. Särskild betydelse av lokalvärd


      
  
           

   

       
  
           


   
 <?php  $mysqli  =  new  mysqli  (  "localhost"  ,  "användare"  ,  "lösenord"  ,  "databas"  );  if  (  $mysqli  ->  connect_errno  )  {  echo  "Det gick inte att ansluta till MySQL: ("  .  $mysqli  ->  connect_errno  .  ") "  .  $mysqli  ->  connect_error  ;  }  echo  $mysqli  ->  host_info  .  "  \n  "  ;  $mysqli  =  new  mysqli  (  "127.0.0.1"  ,  "användare"  ,  "lösenord"  ,  "databas"  ,  3306  );  if  (  $mysqli  ->  connect_errno  )  {  echo  "Det gick inte att ansluta till MySQL: ("  .  $mysqli  ->  connect_errno  .  ") "  .  $mysqli  ->  connect_error  ;  }  echo  $mysqli  ->  host_info  .  "  \n  "  ;  ?> 

Produktion

Localhost via UNIX-socket 127.0.0.1 via TCP/IP

Utförande av uttalanden

Påståenden kan köras med funktionerna mysqli_query(), mysqli_real_query() och mysqli_multi_query(). Funktionen mysqli_query() är den vanligaste och kombinerar den exekverande satsen med en buffrad hämtning av dess eventuella resultatuppsättning i ett anrop. Att anropa mysqli_query() är identiskt med att anropa mysqli_real_query() följt av mysqli_store_result().

Exempel: Ansluta till MySQL


      
  
           


  
     
     
           

 <?php  $mysqli  =  new  mysqli  (  "example.com"  ,  "användare"  ,  "lösenord"  ,  "databas"  );  if  (  $mysqli  ->  connect_errno  )  {  echo  "Det gick inte att ansluta till MySQL: ("  .  $mysqli  ->  connect_errno  .  ") "  .  $mysqli  ->  connect_error  ;  }  if  (  !  $mysqli  ->  fråga  (  "SLÄPP TABELL OM FINNS test"  )  ||  !  $mysqli  ->  fråga  (  "CREATE TABLE test(id INT)"  )  ||  !  $mysqli  ->  fråga  (  "INSERT INTO test (id) VÄRDEN (1)"  ))  {  echo  "Det gick inte att skapa tabell: ("  .  $mysqli  ->  errno  .  ") "  .  $mysqli  ->  fel  ;  }  ?> 

Buffrade resultatuppsättningar

Efter körning av uttalanden kan resultaten hämtas på en gång för att buffras av klienten eller genom att läsa rad för rad. Resultatuppsättningsbuffring på klientsidan gör att servern kan frigöra resurser som är associerade med satsresultaten så tidigt som möjligt. Generellt sett konsumerar kunder långsamt resultat. Därför rekommenderas det att använda buffrade resultatuppsättningar. mysqli_query() kombinerar programutförande och resultatuppsättningsbuffring.

PHP-applikationer kan navigera fritt genom buffrade resultat. Navigeringen är snabb eftersom resultatuppsättningarna hålls i klientminnet. Tänk på att det ofta är lättare att skala efter klient än att skala servern.

Exempel: Navigering genom buffrade resultat


      
  
           


  
     
     
           


  

 
        0  
    
      
         


 
0
    
         

 <?php  $mysqli  =  new  mysqli  (  "example.com"  ,  "användare"  ,  "lösenord"  ,  "databas"  );  if  (  $mysqli  ->  connect_errno  )  {  echo  "Det gick inte att ansluta till MySQL: ("  .  $mysqli  ->  connect_errno  .  ") "  .  $mysqli  ->  connect_error  ;  }  if  (  !  $mysqli  ->  fråga  (  "SLÄPP TABELL OM FINNS test"  )  ||  !  $mysqli  ->  fråga  (  "CREATE TABLE test(id INT)"  )  ||  !  $mysqli  ->  fråga  (  "INSERT INTO test (id) VÄRDEN (1), (2), (3)"  ))  {  echo  "Det gick inte att skapa tabell: ("  .  $mysqli  ->  errno  .  ") "  .  $mysqli  ->  fel  ;  }  $res  =  $mysqli  ->  fråga  (  "VÄLJ ID FRÅN test BESTÄLLNING AV ID ASC" )  ;  echo  "Omvänd ordning...  \n  "  ;  för  (  $row_no  =  $res  ->  num_rows  -  1  ;  $row_no  >=  ;  $row_no  --  )  {  $res  ->  data_seek  (  $row_no  );  $row  =  $res  ->  fetch_assoc  ();  echo  " id = "  .  $row  [  'id'  ]  .  "  \n  "  ;  }  echo  "Resultatuppsättningsordning...  \n  "  ;  $res  ->  data_seek  (  );  while  (  $row  =  $res  ->  fetch_assoc  ())  {  echo  " id = "  .  $row  [  'id'  ]  .  "  \n  "  ;  }  ?> 

Ovanstående exempel kommer att mata ut:

Omvänd ordning... id = 3 id = 2 id = 1 Resultatuppsättningsordning... id = 1 id = 2 id = 3

Obuffrade resultatuppsättningar

Om klientminnet är en kort resurs och det inte behövs att frigöra serverresurser så tidigt som möjligt för att hålla serverbelastningen låg, kan obuffrade resultat användas. Det går inte att rulla igenom obuffrade resultat innan alla rader har lästs.

Exempel: Navigering genom obuffrade resultat



  

 
    
         

 <?php  $mysqli  ->  real_query  (  "VÄLJ ID FRÅN test BESTÄLLNING AV ID ASC" )  ;  $res  =  $mysqli  ->  use_result  ();  echo  "Resultatuppsättningsordning...  \n  "  ;  while  (  $row  =  $res  ->  fetch_assoc  ())  {  echo  " id = "  .  $row  [  'id'  ]  .  "  \n  "  ;  }  ?> 

Resultatuppsättning värden datatyper

Funktionerna mysqli_query(), mysqli_real_query() och mysqli_multi_query() används för att exekvera icke-förberedda satser. På nivån för MySQL Client Server Protocol används kommandot COM_QUERY och textprotokollet för att köra satsen. Med textprotokollet konverterar MySQL-servern all data från en resultatuppsättning till strängar innan den skickas. Denna omvandling görs oberoende av kolumndatatypen för SQL-resultatuppsättningen. MySQL-klientbiblioteken tar emot alla kolumnvärden som strängar. Ingen ytterligare gjutning på klientsidan görs för att konvertera kolumner tillbaka till sina ursprungliga typer. Istället tillhandahålls alla värden som PHP-strängar.

Exempel: Textprotokoll returnerar strängar som standard


      
  
           


  
     
     
           


  
  

  
  
 <?php  $mysqli  =  new  mysqli  (  "example.com"  ,  "användare"  ,  "lösenord"  ,  "databas"  );  if  (  $mysqli  ->  connect_errno  )  {  echo  "Det gick inte att ansluta till MySQL: ("  .  $mysqli  ->  connect_errno  .  ") "  .  $mysqli  ->  connect_error  ;  }  if  (  !  $mysqli  ->  fråga  (  "SLÄPP TABELL OM FINNS test"  )  ||  !  $mysqli  ->  fråga  (  "CREATE TABLE test(id INT, label CHAR(1))"  )  ||  !  $mysqli  ->  query  (  "INSERT INTO test(id, label) VALUES (1, 'a')"  ))  {  echo  "Tabellskapandet misslyckades: ("  .  $mysqli  ->  errno  .  ") "  .  $mysqli  ->  fel  ;  }  $res  =  $mysqli  ->  fråga  (  "SELECT id, label FROM test WHERE id = 1")  ;  $row  =  $res  ->  fetch_assoc  ();  printf  (  "id = %s (%s)  \n  "  ,  $row  [  'id'  ],  gettype  (  $row  [  'id' ])  );  printf  (  "etikett = %s (%s)  \n  "  ,  $row  [  'label'  ],  gettype  (  $row  [  'label'  ]));  ?> 

Ovanstående exempel kommer att mata ut:

id = 1 (sträng) etikett = en (sträng)

Det är möjligt att konvertera heltals- och flytkolumner tillbaka till PHP-tal genom att ställa in anslutningsalternativet MYSQLI_OPT_INT_AND_FLOAT_NATIVE, om du använder mysqlnd-biblioteket. Om inställt kommer mysqlnd-biblioteket att kontrollera resultatuppsättningens metadatakolumntyper och konvertera numeriska SQL-kolumner till PHP-nummer, om PHP-datatypens värdeintervall tillåter det. På detta sätt returneras till exempel SQL INT-kolumner som heltal.

Exempel: Inbyggda datatyper med mysqlnd och anslutningsalternativ


  
 
   

  
           


  
     
     
           


  
  

  
  
 <?php  $mysqli  =  mysqli_init  ();  $mysqli  ->  alternativ  (  MYSQLI_OPT_INT_AND_FLOAT_NATIVE  ,  1  );  $mysqli  ->  real_connect  (  "example.com"  ,  "användare"  ,  "lösenord"  ,  "databas" )  ;  if  (  $mysqli  ->  connect_errno  )  {  echo  "Det gick inte att ansluta till MySQL: ("  .  $mysqli  ->  connect_errno  .  ") "  .  $mysqli  ->  connect_error  ;  }  if  (  !  $mysqli  ->  fråga  (  "SLÄPP TABELL OM FINNS test"  )  ||  !  $mysqli  ->  fråga  (  "CREATE TABLE test(id INT, label CHAR(1))"  )  ||  !  $mysqli  ->  query  (  "INSERT INTO test(id, label) VALUES (1, 'a')"  ))  {  echo  "Tabellskapandet misslyckades: ("  .  $mysqli  ->  errno  .  ") "  .  $mysqli  ->  fel  ;  }  $res  =  $mysqli  ->  fråga  (  "SELECT id, label FROM test WHERE id = 1")  ;  $row  =  $res  ->  fetch_assoc  ();  printf  (  "id = %s (%s)  \n  "  ,  $row  [  'id'  ],  gettype  (  $row  [  'id' ])  );  printf  (  "etikett = %s (%s)  \n  "  ,  $row  [  'label'  ],  gettype  (  $row  [  'label'  ]));  ?> 

Ovanstående exempel kommer att mata ut:

id = 1 (heltal) etikett = a (sträng)

Förberedda uttalanden

MySQL-databasen stöder förberedda uttalanden. En förberedd sats eller en parametriserad sats används för att exekvera samma sats upprepade gånger med hög effektivitet.

Grundläggande arbetsflöde

Utförandet av det förberedda uttalandet består av två steg: förbereda och utföra. I förberedelsestadiet skickas en uttalandemall till databasservern. Servern utför en syntaxkontroll och initierar serverns interna resurser för senare användning.

MySQL-servern stöder användning av anonym, positionell platshållare med ?.

Se exempel i.

Lagrade procedurer

MySQL-databasen stöder lagrade procedurer . En lagrad procedur är en subrutin som lagras i databaskatalogen. Applikationer kan anropa och utföra den lagrade proceduren. CALL SQL-satsen används för att exekvera en lagrad procedur.

Parameter

Lagrade procedurer kan ha IN-, INOUT- och OUT-parametrar, beroende på MySQL-versionen. MySQLi-gränssnittet har ingen speciell uppfattning för de olika typerna av parametrar.

IN-parameter

Inmatningsparametrar tillhandahålls med CALL-satsen. Vänligen, se till att värdena escapes korrekt.

Se exempel i.

Flera påståenden

MySQL tillåter valfritt att ha flera satser i en satssträng. Att skicka flera uttalanden samtidigt minskar klient-server tur och retur men kräver speciell hantering.

Flera satser eller flera frågor måste köras med mysqli_multi_query(). De individuella satserna i satssträngen separeras med semikolon. Sedan måste alla resultatuppsättningar som returneras av de körda satserna hämtas.

MySQL-servern tillåter satser som returnerar resultatuppsättningar och satser som inte returnerar resultatuppsättningar i en multipelsats.

Se exempel i

API-stöd för transaktioner

MySQL-servern stöder transaktioner beroende på vilken lagringsmotor som används. Sedan MySQL 5.5 är standardlagringsmotorn InnoDB. InnoDB har fullt ACID-transaktionsstöd.

Transaktioner kan antingen kontrolleras med SQL eller API-anrop. Det rekommenderas att använda API-anrop för att aktivera och inaktivera det automatiska commit-läget och för att begå och återställa transaktioner.

Exempel här.

Metadata

En MySQL-resultatuppsättning innehåller metadata. Metadata beskriver kolumnerna som finns i resultatuppsättningen. All metadata som skickas av MySQL är tillgänglig via MySQLi-gränssnittet. Tillägget gör inga eller försumbara ändringar av informationen den tar emot. Skillnader mellan MySQL-serverversioner är inte anpassade.

Metadata nås via mysqli_result-gränssnittet.

Se mer här.

MySQLi-tillägget och beständiga anslutningar

Stöd för beständig anslutning introducerades i PHP 5.3 för MySQLi-tillägget. Support fanns redan i PDO MYSQL och ext/mysql. Tanken bakom beständiga anslutningar är att en koppling mellan en klientprocess och en databas kan återanvändas av en klientprocess, snarare än att skapas och förstöras flera gånger. Detta minskar kostnaden för att skapa nya anslutningar varje gång en krävs, eftersom oanvända anslutningar cachelagras och är redo att återanvändas.

Till skillnad från MySQL-tillägget tillhandahåller MySQLi inte en separat funktion för att öppna beständiga anslutningar. För att öppna en beständig anslutning måste du lägga p: till värdnamnet när du ansluter.

Problemet med ihållande anslutningar är att de kan lämnas i oförutsägbara tillstånd av klienter. Till exempel kan ett bordslås aktiveras innan en klient avslutas oväntat. En ny klientprocess som återanvänder denna beständiga anslutning kommer att få anslutningen "som den är". All rensning skulle behöva göras av den nya klientprocessen innan den kunde dra nytta av den ihållande anslutningen, vilket ökar bördan på programmeraren.

Den ihållande anslutningen av MySQLi-tillägget ger dock inbyggd kod för rensningshantering. Rengöringen som utförs av MySQLi inkluderar:

  • Återställ aktiva transaktioner
  • Stäng och släpp tillfälliga tabeller
  • Lås upp bord
  • Återställ sessionsvariabler
  • Stäng förberedda uttalanden (händer alltid med PHP)
  • Stäng hanterare
  • Frigör lås som erhållits med GET_LOCK()

Detta säkerställer att beständiga anslutningar är i ett rent tillstånd när de kommer tillbaka från anslutningspoolen, innan klientprocessen använder dem.

MySQLi-tillägget gör denna rensning genom att automatiskt anropa C-API-funktionen mysql_change_user().

Den automatiska rengöringsfunktionen har dock fördelar och nackdelar. Fördelen är att utvecklaren inte längre behöver oroa sig för att lägga till rensningskod, som det kallas automatiskt. Nackdelen är dock att koden potentiellt kan vara lite långsammare, eftersom koden för att utföra rensningen måste köras varje gång en anslutning returneras från anslutningspoolen.

Det är möjligt att stänga av den automatiska rensningskoden genom att kompilera PHP med MYSQLI_NO_CHANGE_USER_ON_PCONNECT definierad.

Obs: MySQLi-tillägget stöder beständiga anslutningar när du använder antingen MySQL Native Driver eller MySQL Client Library.

Vidare läsning