Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço para converter um script usando funções mysql_ para usar funções mysqli_?

Observação: Convertendo de mysql_ para mysqli_ pode não ser o ideal. Considere PDO se você estiver preparado para converter todo o seu código para OOP .


Pode ser tentador tentar substituir todas as instâncias de mysql_ com mysqli_ e rezar para que funcione. Você estaria perto, mas não exatamente no ponto.

Conectando-se ao banco de dados:


Felizmente, mysqli_connect funciona o suficiente para mysql_query que você pode simplesmente trocar seus nomes de função.

mysql_:
$con = mysql_connect($host, $username, $password);

mysqli_:
$con = mysqli_connect($host, $username, $password);

Selecionando um banco de dados


Agora, com a maioria das outras funções no mysqli_ biblioteca, você precisará passar mysqli_select_db a conexão de banco de dados como sua primeira parâmetro. A maioria dos mysqli_ funções requerem o objeto de conexão primeiro.

Para esta função, você pode simplesmente mudar a ordem dos argumentos que você passa para a função. Se você não passou um objeto de conexão antes, você precisa adicioná-lo como o primeiro parâmetro agora.

mysql_:
mysql_select_db($dbname, $con);

mysqli_:
mysqli_select_db($con, $dbname);

Como bônus, você também pode passar o nome do banco de dados como o quarto parâmetro para mysqli_connect - ignorando a necessidade de chamar mysqli_select_db .
$con = mysqli_connect($host, $username, $password, $dbname);

Higienizar a entrada do usuário


Usando mysqli_real_escape_string é muito semelhante a mysql_real_escape_string . Você só precisa passar o objeto de conexão como o primeiro parâmetro.

mysql_:
$value1 = mysql_real_escape_string($input_string);

mysqli_:
$value1 = mysqli_real_escape_string($con, $input_string);

Muito importante:preparar e executar uma consulta


Uma razão para o mysql_ funções foram preteridas para começar foi sua incapacidade de lidar com instruções preparadas. Se você simplesmente converter seu código para mysqli_ sem dar este passo importante, você está sujeito a algumas das maiores fraquezas do mysql_ funções.

Vale a pena ler estes artigos sobre declarações preparadas e seus benefícios:

Wikipedia - Declarações Preparadas

PHP.net - Declarações Preparadas MySQLi

Observação:ao usar instruções preparadas, é melhor listar explicitamente cada coluna que você está tentando consultar, em vez de usar o * notação para consultar todas as colunas. Dessa forma, você pode garantir que considerou todas as colunas em sua chamada para mysqli_stmt_bind_result .

mysql_:
$query = 'SELECT * FROM table1 WHERE table1.col1=' . $value1 . '';
$result = mysql_query($query, $con);
while($row = mysql_fetch_assoc*$result)
{
    $col1 = $row['col1'];
    $col2 = $row['col2'];

    echo $col1 . ' ' . $col2 . '<br />';
}

mysqli_:
$query = 'SELECT col1,col2 FROM table1 WHERE table1.col1=?';
if ($stmt = mysqli_prepare($link, $query)) {

    /* pass parameters to query */
    mysqli_stmt_bind_param($stmt, "s", $value1);

    /* run the query on the database */
    mysqli_stmt_execute($stmt);

    /* assign variable for each column to store results in */
    mysqli_stmt_bind_result($stmt, $col1, $col2);

    /* fetch values */
    while (mysqli_stmt_fetch($stmt)) {
        /*
            on each fetch, the values for each column 
            in the results are automatically stored in 
            the variables we assigned using 
            "mysqli_stmt_bind_result"
        */
        echo $col1 . ' ' . $col2 . '<br />';
    }

    /* close statement */
    mysqli_stmt_close($stmt);
}

Exibindo erros


Mostrar erros funciona um pouco diferente com mysqli_ . mysqli_error requer o objeto de conexão como seu primeiro parâmetro. Mas e se a conexão falhar? mysqli_ apresenta um pequeno conjunto de funções que não requerem o objeto de conexão:o mysqli_connect_* funções.

mysql_:
if (!$con) {
    die('Could not connect: ' . mysql_error());
}

if (!$result) {
    die('SQL Error: ' . mysql_error());
}

mysqli_:
/* check connection error*/
if (mysqli_connect_errno()) {
    die( 'Could not connect: ' . mysqli_connect_error() );
}

/* check query error */
if ($stmt = mysqli_prepare($link, $query)) {

    // ... execute query

    if (mysqli_stmt_error($stmt)) {
        echo 'SQL Error: ' . mysqli_stmt_error($stmt);
    }
}