accès BD avancés avec mysqli

Ordres SQL avec paramètres d’entrée
(prepared statements)

un insert simple paramétré

<?php
$conn = mysqli_connect(‘localhost’, ‘dd’, ‘dd’, ‘test’);

$stmt = mysqli_prepare($conn, « INSERT INTO CountryLanguage (countrycode, language) VALUES (?, ?) »);
// on associe les variables PHP aux parametres de l’ordre SQL
// il y en a 2 de type string (‘ss’)
mysqli_stmt_bind_param($stmt, ‘ss’, $code, $lang);

// affectation des valeurs de parametre (via les var php)
$code = ‘DEU’; $lang = ‘Bavarian’;

/* execute le prepared statement */
mysqli_stmt_execute($stmt);

print(« Nb de lignes traitees : « .mysqli_affected_rows($conn));

/* fermeture ordre sql */
mysqli_stmt_close($stmt);

/* fermeture connexion */
mysqli_close($conn);
?>

un select paramétré

<?php
$link = mysqli_connect(« localhost », « my_user », « my_password », « world »);
/* Vérification de la connexion */
if (mysqli_connect_errno()) {
printf(« Échec de la connexion : %sn », mysqli_connect_error());
exit();
}
$city = « Paris »;
/* Crée une requête préparée */
if ($stmt = mysqli_prepare($link, « SELECT District FROM City WHERE Name=? »)) {
/* association des variables*/
mysqli_stmt_bind_param($stmt, « s », $city);
/* Exécution de la requête */
mysqli_stmt_execute($stmt);
/* Lecture des variables résultantes */
mysqli_stmt_bind_result($stmt, $district);
/* Récupération des valeurs */
mysqli_stmt_fetch($stmt);
printf(« %s est dans le district de %sn », $city, $district);
/* Fermeture du traitement */
mysqli_stmt_close($stmt);
}
/* Fermeture de la connexion */
mysqli_close($link);
?>

SELECT avec un nombre queLconque de colonnes…
(extrait du manuel PHP, contribution de Matty : http://fr3.php.net/manual/en/function.mysqli-stmt-bind-result.php)

<?php
# of fields in result set.
$nof = mysqli_num_fields( mysqli_stmt_result_metadata($handle) );

# The metadata of all fields
$fieldMeta = mysqli_fetch_fields( mysqli_stmt_result_metadata($handle) );

# convert it to a normal array just containing the field names
$fields = array();
for($i=0; $i < $nof; $i++)
$fields[$i] = $fieldMeta[$i]->name;

# The idea is to get an array with the result values just as in mysql_fetch_assoc();
# But we have to use call_user_func_array to pass the right number of args ($nof+1)
# So we create an array:
# array( $stmt, &$result[0], &$result[1], … )
# So we get the right values in $result in the end!

# Prepare $result and $arg (which will be passed to bind_result)
$result = array();
$arg = array($this->stmt);
for ($i=0; $i < $nof; $i++) {
$result[$i] =  »;
$arg[$i+1] = &$result[$i];
}

call_user_func_array (‘mysqli_stmt_bind_result’,$arg);

# after mysqli_stmt_fetch(), our result array is filled just perfectly,
# but it is numbered (like in mysql_fetch_array() ), not indexed by field name!
# If you just want to mimic that ones behaviour you can stop here 🙂

mysqli_stmt_fetch($this->stmt);

# Now you can use $result
print_r($result);

# But beware! when using the fetch in a loop, always COPY $result or else you might
# end with all the same values because of the references
?>