Pergunta

Eu estou tentando converter o código do MySQL para mysqli. O código usa um único mysql_connect em um arquivo que está incluído por qualquer outro arquivo.

mysql_connect retorna um identificador de conexão MySQL que é uma superglobal para que você possa confiar em ter uma conexão de banco de dados disponível em qualquer uma das suas próprias funções.

Parece que com mysqli_connect este não é o caso, o objeto retornado não é global.

Isso significa que eu tenho que adicionar: $ mysqli global; no topo de cada função, ou há uma maneira de torná-lo uma superglobal?

Foi útil?

Solução

Baseando-se no fato de que o PHP irá usar o último recurso de conexão aberta se você não especificar um, provavelmente não é uma idéia muito boa.
O que acontece se o seu aplicativo muda e você precisa de duas conexões, ou a conexão não está lá?
Assim, parece que você precisa fazer alguma refatoração de qualquer maneira.

Aqui está uma solução semelhante à Karsten do que sempre retorna o mesmo objeto mysqli.

class DB {
    private static $mysqli;
    private function __construct(){} //no instantiation

    static function cxn() {
        if( !self::$mysqli ) {
            self::$mysqli = new mysqli(...);
        }
        return self::$mysqli;
    }
}        

//use
DB::cxn()->prepare(....

Outras dicas

Eu costumo fazer uma função:

$mysqli = new mysqli(...);

function prepare($query) {
  global $mysqli;
  $stmt = $msqyli->prepare($query);
  if ($mysqli->error()) {
    // do something
  }
  return $stmt;
}

function doStuff() {
  $stmt = prepare("SELECT id, name, description FROM blah");
  // and so on
}

e, em seguida, chamar isso. Dito isto, tenho uma vez abandonada mysqli como sendo demasiado cheia de defeitos para ser considerado utilizável. Pena realmente.

Para introduzir algum oop para você e resolver o seu problema, você pode usar uma classe como este:

class MyDatabase
{
    private static $_connection;

    public static function connect()
    {
        $mysqli = new mysqli(...);
        self::$_connection = $mysqli;
    }

    public static function getConnection()
    {
        return self::$_connection;
    }
}

Em seu arquivo de banco de dados de conexão que você iria carregar esta classe e executar MyDatabase::connect(); uma vez. Para obter a qualquer lugar mysqli-conexão $ em seu script, apenas MyDatabase::getConnection(); chamada.

Uma maneira muito simples de fazer isso seria com uma classe de banco de dados fixa, apenas para manter o objeto de conexão mysqli:

class Database {
    public static $connection;
}

Database::$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);

Em seguida, você pode acessá-lo nos caminhos normais:

$sql = 'SELECT * FROM table';
$result = Database::$connection->query($sql);
$result = mysqli_query(Database::$connection, $sql);
echo 'Server info ' . mysqli_get_server_info(Database::$connection);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top