[RESOLU] caractère spéciaux dans sauvegarde de bdd phpmyadmin

Eléphant du PHP | 89 Messages

16 mai 2023, 23:31

Bonsoir, j'ai un problème avec la sauvegarde de ma base de donnée. En effet, celle-ci marche très bien sauf quand elle croise des caractère spéciaux qui deviennent des ?
Savez vous comment régler ce problème ? Sachant que dans la bdd il n'y a pas de problème avec les caractères spéciaux.

Code : Tout sélectionner

<?php $errors = []; $success = []; $DB_HOST = "localhost"; $DB_USER = "root"; $DB_PASS = ""; $DB_NAME = "sdz"; $con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); $tables = array(); $result = mysqli_query($con,"SHOW TABLES"); while ($row = mysqli_fetch_row($result)) { $tables[] = $row[0]; } $return = ''; foreach ($tables as $table) { $result = mysqli_query($con, "SELECT * FROM ".$table); $num_fields = mysqli_num_fields($result); $return .= 'DROP TABLE '.$table.';'; $row2 = mysqli_fetch_row(mysqli_query($con, 'SHOW CREATE TABLE '.$table)); $return .= "\n\n".$row2[1].";\n\n"; for ($i=0; $i < $num_fields; $i++) { while ($row = mysqli_fetch_row($result)) { $return .= 'INSERT INTO '.$table.' VALUES('; for ($j=0; $j < $num_fields; $j++) { if (isset($row[$j])) { $return .= '"'.$row[$j].'"';} else { $return .= '""';} if($j<$num_fields-1){ $return .= ','; } } $return .= ");\n"; } } $return .= "\n\n\n"; } $handle = fopen('C:\Users\antoi\OneDrive\Bureau\sauvegarde/sdz.sql', 'w+'); fwrite($handle, $return); fclose($handle); if (!$handle) { $errors[] = sprintf('Aucun client qui porte le nom où prénom `%s` ne possède de carte complète !', $_POST['nom']); } else if (empty($errors)) { $success[] = sprintf('La sauvegarde de la base de données des compétences et des élèves a été effectuée !'); } ?>

Avatar du membre
Mammouth du PHP | 1564 Messages

17 mai 2023, 08:28

Après la connexion à la base fait un
mysqli_query($con,"SET CHARACTER SET 'utf8'");

Eléphant du PHP | 89 Messages

17 mai 2023, 09:18

Je l'ai insérer à cette endroit-ci :

Code : Tout sélectionner

$con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); mysqli_query($con,"SET CHARACTER SET 'utf8'");
Cependant mon problème ne change pas je récupère toujours des ? au lieux des caractères spéciaux (le type d'interclassement dans la bdd est utf8_general_ci)

Avatar du membre
Mammouth du PHP | 1564 Messages

17 mai 2023, 10:08

Quels sont les caractères en question ?

PS: si tu fait "new mysqli()" utilise pas le style procédural ensuite, continu en orienté object, pas d'incidence mais pour la lisibilité, c'est plus clair de ne pas mélanger les deux styles.

Donc fait un mysqli_connect() à la place.

Eléphant du PHP | 89 Messages

17 mai 2023, 10:14

Donc si j'ai bien compris ce que tu me dis de faire c'est de remplacer mon new mysqli() par un mysqli_connect(). Cela ne règle pas le problème.
Le problème que j'ai est avec les accents, le ç (ce type de caractère car pour les ' je les récupère bien)

Eléphant du PHP | 89 Messages

17 mai 2023, 10:46

Également j'ai fait une var_dump($con) avant et après le mysqli_query($con,"SET CHARACTER SET 'utf8'"); et le résultat que j'obtiens est le même :

object(mysqli)[2]
public 'affected_rows' => int 0
public 'client_info' => string 'mysqlnd 7.4.26' (length=14)
public 'client_version' => int 70426
public 'connect_errno' => int 0
public 'connect_error' => null
public 'errno' => int 0
public 'error' => string '' (length=0)
public 'error_list' =>
array (size=0)
empty
public 'field_count' => int 0
public 'host_info' => string 'localhost via TCP/IP' (length=20)
public 'info' => null
public 'insert_id' => int 0
public 'server_info' => string '5.7.36' (length=6)
public 'server_version' => int 50736
public 'sqlstate' => string '00000' (length=5)
public 'protocol_version' => int 10
public 'thread_id' => int 740
public 'warning_count' => int 0

Avatar du membre
Mammouth du PHP | 1564 Messages

17 mai 2023, 11:15

Excuse moi, c'est :
mysqli_query($con, "SET NAMES utf8");

Eléphant du PHP | 89 Messages

17 mai 2023, 12:27

Ah je n'ai pas la possibilité de faire un essai maintenant pour voir si ça marche avec cette correction. Je verrai ce soir et te tiens au courant

ynx
Mammouth du PHP | 586 Messages

17 mai 2023, 13:54

D'après les exemples de la doc, il faudrait plutôt utiliser $mysqli->set_charset() en orienté objet ou mysqli_set_charset() en procédurale.
https://www.php.net/manual/fr/mysqli.construct.php

Si c'est pour faire une sauvegarde de la bdd, tu pourrais p-e utiliser l'outil mysqldump à la place de ton script php.
https://rdr-it.com/sauvegarder-vos-base ... mysqldump/

Eléphant du PHP | 89 Messages

17 mai 2023, 17:42

Excuse moi, c'est :
mysqli_query($con, "SET NAMES utf8");
Alors je viens d'essayer et cela ne marche toujours pas

Eléphant du PHP | 89 Messages

17 mai 2023, 17:46

D'après les exemples de la doc, il faudrait plutôt utiliser $mysqli->set_charset() en orienté objet ou mysqli_set_charset() en procédurale.
https://www.php.net/manual/fr/mysqli.construct.php
J'ai essayer les deux et ils ne marchent pas non plus.
Si c'est pour faire une sauvegarde de la bdd, tu pourrais p-e utiliser l'outil mysqldump à la place de ton script php.
https://rdr-it.com/sauvegarder-vos-base ... mysqldump/
Alors le but c'est de pouvoir utiliser le site que je monte en local sans internet donc si j'utilise l'outil mysqldump je devrais obligatoirement utiliser internet lors de la sauvegarde non ?

ynx
Mammouth du PHP | 586 Messages

17 mai 2023, 19:16

L'outil mysqldump est automatiquement installé lors de l'installation de Mysql.
Si tu as installé Mysql en local, tu dois déjà avoir mysqldump aussi en local que tu peux donc utiliser sans internet.
mysqldump s'utilise en ligne de commande (dans un Terminal ou Invité de commandes).

Eléphant du PHP | 89 Messages

17 mai 2023, 19:26

L'outil mysqldump est automatiquement installé lors de l'installation de Mysql.
Si tu as installé Mysql en local, tu dois déjà avoir mysqldump aussi en local que tu peux donc utiliser sans internet.
mysqldump s'utilise en ligne de commande (dans un Terminal ou Invité de commandes).
Alors je n'ai pas installer Mysql j'ai installer wampserver donc ça n'a pas l'air d'être pris en compte dedans (ou sinon je ne trouve pas comment l'utiliser)

Mammouth du PHP | 2703 Messages

17 mai 2023, 22:26

wamp = windows apache mysql php
donc mysql est bien installé.

sinon, il faut que tout soit en utf8, encodage du fichier php, sortie de l'html ...

Avatar du membre
Mammouth du PHP | 1564 Messages

17 mai 2023, 23:03

wamp = windows apache mysql php
Merci pour l'info ;)