Vraag Verhuizen van mysql-verbinding naar mysqli


Ik heb een functie die ik vroeger gebruikte met mijn scripts. openDBConn() en closeDBConn() Deze beiden noemden de mysql_connect() functie. Gebruikt zoals hieronder te zien

openDBConn();
$car_model = getCarModel($car_id);
$car_color = getCarColor($car_id);
closeDBConn();

als ik het op deze manier doe, kan ik ook het volgende doen

openDBConn();
mysqlStartTranscation();

upgradeCarColor($car_id);
addNewWing($car_id);

mysqlCommit();
closeDBConn();

Dilemma is nu, als ik naar mysqli ga, moet ik de verbindingslink doorgeven.

Ik heb ook gelezen dat mysql_ * wordt beëindigd, de vragen die ik heb zijn:

  1. Hoeveel tijd heb ik voordat de meeste functies niet meer werken?
  2. Is er een huidige of toekomstige manier om toegang te krijgen tot de huidige mysqli-verbinding, omdat het toevoegen van extra parameters aan mijn functies een pijn is?
  3. Is er een juiste manier om de huidige mysqli-verbindingslink op een procedurele manier te benaderen? Als het niet procedureel is, wat is het beste op een OOP-manier?

21
2017-12-08 11:18


oorsprong


antwoorden:


  1. Je hebt alle tijd van de wereld omdat ze nooit ophouden met alleen te werken!
  2. Ja, er zijn verschillende manieren om dit te doen.
  3. Ja, maar er is geen one-size-fits-all oplossing. Elke situatie is anders en wat goed is voor uw specifieke situatie is mogelijk niet geschikt voor elke situatie.

Ten eerste is de oude ext / mysql gedeprecieerd vanaf PHP 5.5.0, maar hij zal nooit stoppen met werken omdat de extensie zelf uiteindelijk naar de PHP PECL-repository (wanneer het tijd is om het te verwijderen). We zijn er echter nog niet en u kunt alleen worden beïnvloed wanneer en of u ervoor hebt gekozen om naar die versie van PHP te upgraden. Er is geen exacte tijd bepaald voor het verwijderen van de extensie.

Ten tweede kunt u een variabele gebruiken om de databaseverbinding op te slaan, net zoals de oude ext / mysql-extensie achter de schermen voor u deed. De truc was dat je je niet bewust was van wat het deed (het maakt gebruik van de laatste open verbinding die je hebt gemaakt toen je mysql_connect noemde en gebruikt dat elke keer dat je zoiets als mysql_query roept om toegang te krijgen tot de database).

U kunt dit doen met een statische variabele in uw functie met behulp van procedurele stijl ....

function openDBConn() {
    static $link;
    if (!isset($link)) {
      $link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
    }
    return $link; // returns the link
}

Of u kunt dit doen met een klasse-statische variabele met behulp van OOP ...

Class MyDBConnect {

    public static $link;

    public function openDBConn() {
        if (!isset(static::$link)) {
            static::$link = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
        }
    }

}

Ik wil u aanmoedigen om de nieuwere API's te gebruiken en ik prijs u ervoor, maar ik wil u ook waarschuwen als u verder gaat. Wanneer u uw functies van de oude ext / mysql-functies naar de nieuwe mysqli-extensie gaat porten, moet u ervoor zorgen dat u ook de slechte praktijken van de oude extensie niet port (zoals het gebruik van de oude SQL-tekenreeks-aaneenschakeling en escape-technieken ext / mysql aangeboden). Profiteer in plaats daarvan van MySQLi voorbereide instructies en geparameteriseerde vragen.

Waar ik wel de aandacht op wil vestigen, zijn de voordelen van het gebruik van de nieuwere API's om te koppelen met uw MySQL-database (namelijk BOB en MySQLi).


14
2017-12-08 11:33



Allereerst geef ik +1 aan uw vraag omdat het iets goeds is dat u uw migratie start.

OOP en argument

Over OOP-programmering en doorgeven van argumenten, hier is een oplossing die is gebaseerd op Singleton Factory-patroon:

class MysqliConnection{
   private static $connection = null;
   public static function getConnection(){


       if(self::$connection === null){
           //Here get some routine to make your configuration extern
           self::$connection = new Mysqli(/*args*/);
       }
       return self::$connection;
}

Wanneer u een query wilt verzenden, kunt u deze als volgt gebruiken:

 function methodWhichSendsAQuery(){
      $mysqli = MysqliConnection::getConnection();
      $query = $mysqli->prepare(/*your query*/);
      /*some param bindings with $query->bindParam()*/
      $query->execute();
      return $query->fetchAll(); //an array with all results
  }

Ik geef de voorkeur aan deze oplossing boven de andere omdat deze schoon en leesbaar is en niet afhankelijk is van globale variabelen. Single Responsability Principle wordt gerespecteerd en het is OK.

Mysql_ herwaarderen naar mysqli

Het refactoring kan heel moeilijk zijn als je gewend bent om mysql_ op de oude manier af te handelen, ik bedoel zonder ressource argument, mysql_escape_stringenz. enzovoort.

Mysql zorgde voor een script dat nogal krachtig is om te migreren van mysql_ naar mysqli hier en je kunt meer informatie krijgen hier.

Wat ik tegen je kan zeggen is dat mysqli een functionaliteit met de naam "voorbereide verklaring" oplevert werkelijk krachtig en sterk over beveiliging. De manier waarop mysqli de voorbereide instructie afhandelt, is minder gebruikersvriendelijk dan de manier waarop PDO het doet, maar de eigenschappen zijn hetzelfde.


3
2017-12-08 11:31