[RESOLU] Notice: Trying to get property of non-object in

Eléphant du PHP | 153 Messages

25 mai 2019, 22:10

il a terminé je vais voir ce qu'il y a dedans ...

Eléphant du PHP | 153 Messages

25 mai 2019, 22:12

j'ai copié les 5 dernières lignes à priori c'est bon .???

Code : Tout sélectionner

UPDATE dictionnaire SET sorted_letters = 'eimoqstuyz' WHERE scrabble_name = 'zymotiques'; UPDATE dictionnaire SET sorted_letters = 'hnotyz' WHERE scrabble_name = 'zython'; UPDATE dictionnaire SET sorted_letters = 'hnostyz' WHERE scrabble_name = 'zythons'; UPDATE dictionnaire SET sorted_letters = 'hmtuyz' WHERE scrabble_name = 'zythum'; UPDATE dictionnaire SET sorted_letters = 'hmstuyz' WHERE scrabble_name = 'zythums';

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 22:13

Normalement 300k+ requêtes update. Et l'import via phpmyadmin dervait passer par la commande mysql ce qui devrait aller bcp bcp plus vite qu'exécuter indépendamment les 300k+ requêtes avec php.

EDIT : oui c'est bon !
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

25 mai 2019, 22:14

phpMyAdmin - Error

Error during session start; please check your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.

session_start(): Cannot send session cookie - headers already sent

session_start(): Cannot send session cache limiter - headers already sent

Cannot modify header information - headers already sent

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 22:17

C'est quand tu tentes d'importer le fichier avec phpmyadmin ? il pèse combien ?
C'est étrange c'est typiquement l'erreur qu'on a quand on fait un session_start() mais qu'une sortie est déjà partie vers le client.
Mais il ne devrait pas y avoir ce genre d'erreur dans le code de phpmyadmin.

PS : si tu as un accès en ligne de commande tu peux faire via la commande mysql :
mysql --user=leuser --password=lepass --host=127.0.0.1 labase < update-dictionnaire-sorted_letters.sql
Modifié en dernier par Saian le 25 mai 2019, 22:28, modifié 1 fois.
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

25 mai 2019, 22:18

(Taille maximale : 32 Mio) pour PhpAdmin
et le fichier fait 35,7, je vais le couper en deux...

Eléphant du PHP | 153 Messages

25 mai 2019, 23:05

Petit souci que je viens de voir il a exporter le fichier avec de mauvais accents : exemple : défolias

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 23:17

Ça c'est un problème d'encodage de caractères. On dirait de l'utf-8 affiché en iso-8859-1 ou dans le genre. Lors de l'import sur phpmyadmin tu dois pouvoir spécifier l'encodage du fichier. J'imagine que phpmyadmin s'occupe de convertir l'encodage du fichier vers celui de la base de données (ou plutôt doit le spécifier à la commande mysql).
Le charset peut également être spécifié avec la commande mysql -default_character_set utf8.
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

26 mai 2019, 12:01

Bonjour Saian, finalement il s'est passé deux choses, la première j'ai mis phpMyAdmin à jour (Mamp 5.3).
Deuxième le fichier que tu m'as proposé pour aller plus vite , c'est vrai, il créé le fichier plus rapidement mais le renvoi à phpMyAdmin est encore plus long, donc je voudrais relancé le mod classique "/** SCRIPT UPDATE DATABASE - EXECUTE ONCE */" ...

Après un essai je m’aperçois qu'il n'est pas bon pour les caractères , j'ai mis dans la BD : "aalenienné" volontairement avec un accent et au résultat il me met aalenienny , il va chercher le Y dans :

Code : Tout sélectionner

$str = strtr($str, // sans accents 'àáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'aaaaaaceeeeiiiioooooouuuuyy');


il ne remplace pas l'accent du mot "aalenienné" mais il cherche la dernière lettre de : 'aaaaaaceeeeiiiioooooouuuuyy' donc le "aalenienny"

Bizarre tout ça ..

Avatar du membre
Mammouth du PHP | 1609 Messages

26 mai 2019, 19:11

Bonjour jefekoi, les accents remplacés par les caractères non accentués dans sorted_letters c'est voulu. En revanche les problèmes de conversion non. Ils doivent être du à des problèmes d'encodage des caractères.

Pour éviter ces problèmes le plus simple est que tout soit encodé dans le même encodage. Et l'encodage a privilégier sans rentrer dans le détail est l'UTF-8.

J'ai déjà vu que ton site a un charset utf-8 (<meta charset="utf-8">).
Ta base de données doit également être en utf-8. Je privilégie personnellement l'encodage ut8_unicode_ci mais je ne me souviens pas de la base technique de ce choix.
Lorsque tu te connectes à la base de données, il est bon de passer en suivant, une fois, la requête SET NAMES UTF8, mais je pense que c'est dispensable si le jeux de caractères par défaut de mysql est bien l'utf-8.
La directive default_charset du fichier php.ini doit être définit à UTF-8 (default_charset = "UTF-8").
Et pour finir tes fichiers php doivent être enregistrés eux aussi en utf-8 (sans BOM, problèmes de headers already sent sinon).

Voilà, si tout est en utf-8 tu ne devrais avoir aucun problème d'accent.

Pour ce qui est de l'import du dump sql plus lent que l'exécution du script php, cela m'étonne beaucoup. Peut être devrais tu plutôt essayer de passer par la commande mysql pour être sûr.
mysql --default_character_set utf8 --user=leuser --password=lepassword --host=127.0.0.1 lanomdelabase < update-dictionnaire-sorted_letters.sql

Sinon j'ai jamais testé comme ça mais peut être que le script php pourrait être plus rapide en faisant un commit de toutes les requêtes ou un commit toutes les x requêtes (pourquoi pas 1000, ce qui ferait 300 et quelques commits) :
/** SCRIPT UPDATE DATABASE - EXECUTE ONCE V3 */
require ('mysqli_conn.php');
$conn = new mysqli($servername, $username, $password, $dbname);

$query = 'SELECT * FROM dictionnaire';
$words = $conn->query($query);

$conn->autocommit(false);

$i = 0;
while ($word = $words->fetch_object())
{
  $sorted_letters = $conn->real_escape_string(sort_alpha_noaccent_tolower($word->scrabble_name));
  $update = "UPDATE dictionnaire SET sorted_letters = '$sorted_letters' WHERE scrabble_name = '{$word->scrabble_name}'";
  $conn->query($update);

  if (++$i % 1000 == 0)
    $conn->commit();
}

$conn->commit();
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

26 mai 2019, 19:34

Merci l'ami,

J'avais finalement fait de cette manière, je pense que ce n'est pas le meilleur moyen mais ça marche :

Code : Tout sélectionner

function suppr_accents($chaine) { $accents = array('À','Á','Â','Ã','Ä','Å','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ò','Ó','Ô','Õ','Ö','Ù','Ú','Û','Ü','Ý','à','á','â','ã','ä','å','ç','è','é','ê','ë','ì','í','î','ï','ð','ò','ó','ô','õ','ö','ù','ú','û','ü','ý','ÿ'); $sans = array('A','A','A','A','A','A','C','E','E','E','E','I','I','I','I','O','O','O','O','O','U','U','U','U','Y','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','o','o','o','o','o','o','u','u','u','u','y','y'); return str_replace($accents, $sans, $chaine); } function sort_alpha_noaccent_tolower($str) { $str = mb_strtolower($str); // tout en minuscules $str = suppr_accents($str); $str = str_split($str,1); sort($str); return trim(implode('',$str)); // supprime les espaces (si on a plusieurs mots) }
voilà ce que ça donne sur la BD :
https://zupimages.net/up/19/21/zle7.png

Et lorsque je fais une recherche du mot : aalenienné il me donne :
2 : aelenienna
3 : aalenienné
via ton programme :

Code : Tout sélectionner

while ($word = $words->fetch_object()) { //if ($word->scrabble_name != $search) echo $word->scrabble_id." : ".$word->scrabble_name.'<br/>'; }
Pour l'instant j'ai relancé le premier programme (celui qui va duré plus de dix heures) je l'ai lancé vers 18h00 mais avant j'ai modifié dans php.ini : max_execution_time

Tout va bien :)

Avatar du membre
Mammouth du PHP | 1609 Messages

26 mai 2019, 19:41

Ok, y avait peut être une erreur de logique dans la fonction sort_alpha_noaccent_tolower. La au moins le str_replace il pourra pas se tromper. ;)
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1609 Messages

27 mai 2019, 01:03

Juste comme ça au passage, je pensais à toi en me brossant les dents ^^ et si ce n'est pas déjà fait, ajoutes un index sur la colonne scrabble_name, ça devrait aller vraiment beaucoup plus vite et pareil sur la colonne sorted_letters, les requêtes pour chercher les anagrammes seront beaucoup plus performantes.
Je t'assure que les index font vraiment une très grosse différence surtout quand tu fais beaucoup de requêtes comme lors de l'update de toute la base de données.
Avec phpmyadmin, onglet Structure de la table et t'as juste à cliquer sur le lien Index de chacune des deux colonnes. Attention il faut bien que tu crées un index pour chaque colonne et non un index pour les deux (ne pas cocher les deux colonnes puis cliquer le lien Index sous le tableau).
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

27 mai 2019, 05:48

Merci Saian, non je n'ai pas fait, mais en même temps je vais surement reprendre le programme (je ne suis pas pressé) il en est à la lettre C au bout de 12h00 .. Je vais essayé avec l'exportation du fichier sql ... je penserai à toi pour l'indexage :)

Eléphant du PHP | 153 Messages

27 mai 2019, 18:32

Ho purée ton histoire d'index c'est superbe en moins de deux il a tout fait :)