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

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 18:27

Pas sur de bien comprendre, mais je vois quand même un problème ici :
if ($motDico && $motDico->num_rows > 0)
{
  while($row = $motDico->num_rows())
  {
    echo $row['scrabble_lettre'].'<br />';
  }
}

Si tu veux boucler sur les résultats tu dois utiliser une des méthode fetch de la class mysqli_result. Et étant donné le echo ce devrait être fetch_assoc.
if ($motDico && $motDico->num_rows > 0)
{
  while($row = $motDico->fetch_assoc())
  {
    echo $row['scrabble_lettre'].'<br />';
  }
}

De plus la requête n'est pas logique :
SELECT * FROM dictionnaire WHERE scrabble_lettre = 'acehnrt';
Alors que la colonne scrabble_letter semble ne contenir que 1 lettre pour chaque ligne de la table, la requête ne te retournera jamais aucun résultat...
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

25 mai 2019, 18:33

Il faudrait alors que je mette plutôt :
$selectDicoo = "SELECT * FROM $lettre WHERE scrabble_name = '$sorted';";

??

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 18:35

Si tu veux remonter la ligne où scrabble_name est égale à chanter il faut alors que ta requête est un WHERE scrabble_name = 'chanter'.
Les anagrammes semblent être stockés dans la colonne scrabble_anagramme.
Par contre si tu cherches toutes les lignes du dictionnaire ou chanter fait parti des anagrammes, tu devrais avoir un WHERE scrabble_anagramme LIKE '%chanter%'.

A côté de ça l'idée de trier les lettres du mot par ordre alphabétique est très intéressante.
Tu fais un script où tu boucles sur tout ton dictionnaire. Pour chaque mot (scrabble_name) tu génères cette chaine des lettres triées par ordre alphabétique et tu la stockes sur la ligne dans une colonne disons scrabble_index.
Ainsi tous les mots contenant exactement les mêmes lettres auront tous le même index.

Il sera ensuite très simple de retrouver tous les anagrammes d'un mot. Il te suffira pour un mot de générer cette chaine de lettres ordonnées et de faire une simple requête WHERE scrabble_index = '$sorted'.

EDIT : ok en relisant ton code je vois que c'est ce que tu essaies de faire avec la colonne sorted_letters. C'est très bien.
Donc tu n'as plus qu'à faire un WHERE sorted_letters = '$sorted'

PS : par contre ta boucle d'update tu n'as pas besoin de la faire à chaque recherche. Tu as besoin de la faire 1 fois pour initialiser la colonne sorted_letters sur toute ta table. Ensuite tu pourras faire la manipulation de trie des lettres et renseigner la colonne simplement à chaque fois que tu ajoutes un nouveau mot.
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

25 mai 2019, 18:51

Wouaa c'est chaud tout ça :)

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 18:53

Bah en fait non c'est exactement ce que tu fais (enfin presque), tu as même écris en commentaire // A FAIRE UNE FOIS POUR TOUTES ^^
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

25 mai 2019, 18:55

Oui mais je dois avouer que j'ai été un peu aider sur un autre site mais pas aussi sympa que celui ci :)

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 19:02

Voilà, code non testé donc possibles erreurs mais c'est ça. Les 2 parties SCRIPT devraient être dans 2 fichiers différents. La fonction sort_alpha_noaccent_tolower pourrait aller dans un fichier d'include séparé que tu inclurais dans les 2 scripts comme le script mysqli_conn.php.
<?php

/** FUNCTIONS */
function sort_alpha_noaccent_tolower($str)
{
  $str = mb_strtolower($str);		// tout en minuscules
  $str = strtr($str,				// sans accents
    'àáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
    'aaaaaaceeeeiiiioooooouuuuyy');
  $chr = str_split($str,1);
  sort($chr);						// ordre alphabetique
  return trim(implode('',$chr));	// supprime les espaces (si on a plusieurs mots)
}


/** SCRIPT UPDATE DATABASE - EXECUTE ONCE */
require ('mysqli_conn.php');
$conn = new mysqli($servername, $username, $password, $dbname);

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

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'";
  $conn->query($update);
}


/** SCRIPT LOOKING FOR ANAGRAMMES */
require ('mysqli_conn.php');
$conn = new mysqli($servername, $username, $password, $dbname);

$search = 'chanter';
$sorted_letters = $conn->real_escape_string(sort_alpha_noaccent_tolower($search));

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

while ($word = $words->fetch_object())
{
  if ($word->scrabble_name != $search)
    echo $word->scrabble_name.'<br/>';
}

Les test if ($words->num_rows > 0) sont dispensables, s'il n'y a pas de lignes retournées, les while feront false dès leur première itération.

Et j'ai enlevé les tests de résultat car quand on est sûr de sa requête c'est pas indispensable. ^^
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

25 mai 2019, 19:16

Merci Sain, je suis en train de le tester, le programme cherche pour le moment

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 19:18

Si tu as beaucoup de lignes dans le dictionnaire, la mise à jour de toutes les lignes peut prendre un peu de temps.
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

25 mai 2019, 19:21

393672 lignes
J'avais déjà gonfler dans php.ini le "temps max_execution_time" :)

Eléphant du PHP | 153 Messages

25 mai 2019, 19:23

Je viens d'arrêter volontairement le programme, j'ai vu le résultat dans la BD
https://zupimages.net/up/19/21/tiop.png

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 19:27

C'est pas bon il y a un problème tu ne devrais pas avoir le même sorted_letters sur toutes les lignes. J'ai oublié le WHERE dans le update 2min ça vient.
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

25 mai 2019, 19:28

sur d'autres pages j'ai d'autres mots , plus je vais loin plus ce sont des mots dfférents

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 19:28

/** SCRIPT UPDATE DATABASE - EXECUTE ONCE */
require ('mysqli_conn.php');
$conn = new mysqli($servername, $username, $password, $dbname);

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

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);
}
Tu m'étonnes que c'était long, pour chaque mot ça updatait tous les mots. ^^
Logiquement tous les mots devaient avoir la valeur triée du dernier ou avant dernier mot traité quand tu as stoppé le script.
C'est la colonne sorted_letters que tu dois regarder pas scrabble_anagramme que le script ne modifie pas.

La colonne scrabble_anagramme n'est pas utile car pour récupérer tous les anagrammes d'un mot tu utilises le deuxième script,
/** SCRIPT LOOKING FOR ANAGRAMMES */.
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

25 mai 2019, 19:40

Le serveur à planté j'ai du relancer je n'arrivait plus à aller sur phpMyAdmin , j'ai modifié et j'ai relancé .. j'attends la fin