8768 sujets

Développement web côté serveur, CMS

Bonjour,

Voici mon problème :
A chaque appel d'une API, je récupère 3 proverbes aléatoirement, avec les champs idproverbe et proverbe.

Je souhaite enregistrer dans une table, les proverbes qui ne sont pas encore présents dans cette table.

Comment comparer les idproverbe présents dans la table avec ceux que retourne l'API, de manière à enregistrer seulement les nouveaux proverbes ?


Je complète mon explication par le code que j'ai tenté de mettre en place.


//Je commence par sélectionner les identifiants de proverbes déja présents dans la table.

	$select = 'SELECT idproverbe FROM proverbes';
	$res = mysqli_query($connexion, $select);
	
	while ($data = mysqli_fetch_assoc($res)) 
{
	$tousIdproverbe .= ''.$data['idproverbe'].',';
}

	

// Je les regroupe sous cette forme : 1547, 14565, 2145

	
	$tousIdproverbe = substr($tousIdproverbe, 0, -1);
	
	
// Ensuite je récupère les infos provenant de mon API

$url = '... apis/export.php?num=3';
$json = file_get_contents($url);
$json_data = json_decode($json, true);


for ($i=1; $i<4; $i++) {
	$fluxidproverbe = $json_data[$i]["idproverbe"];
	$fluxproverbe = $json_data[$i]["proverbe"];
	
	

// C'est ici que j'ai un problème pour définir la manière de comparer les identifiants pour permettre ou non l'exécution de l'enregistrement dans la table
//J'ai tenté ceci sans succès:

$ids = Array($tousIdproverbe);

					if (!in_array($fluxidproverbe, $ids) )
					{
						$sql = "INSERT INTO proverbes (id, idproverbe, proverbe) VALUES ('', '$fluxidproverbe', '$fluxproverbe')";
							if (mysqli_query($connexion, $sql)) { echo "enregistrement effectué"; } else { echo "Erreur: " . mysqli_error($connexion); }	
					}

}



Je vous remercie de votre aide.
Modifié par Agold (01 Nov 2018 - 12:31)
Bonjour,

Ton erreur est de croire que quand tu fais "Array($tousIdproverbe);", PHP va convertir ta liste de valeurs en tableau. Ce n'est pas le cas. Ce que tu voulais faire c'est ça :

$ids = explode(',', $tousIdproverbe);


Après, tu pourrais certainement traiter $tousIdproverbe comme un tableau dès le départ, à moins que tu n'en aies besoin absolument sous forme de chaine de caractères plus loin dans ton code.

Et sinon évite d'utiliser directement des variables provenant de l'extérieur dans des requêtes SQL, c'est risqué. Utilise la fonction mysqli_real_escape_string() pour préparer tes variables, de cette façon :

$sql = "INSERT INTO proverbes (id, idproverbe, proverbe) VALUES ('',".mysql_real_escape_string($fluxidproverbe).",".mysqli_real_escape_string($fluxproverbe.")";


Bon courage Smiley cligne
Merci pour ces infos.
J'ai modifié ma requête pour y intégrer la fonction mysql_real_escape_string.

Finalement pour ceux que ça intéresse, j'ai résolu mon problème en définissant le champs ids en UNIQUE dans MYSQL et j'ai ajouté IGNORE (INSERT IGNORE INTO) pour éviter un message d'erreur lorsque l'élément à enregistrer est déjà présent.