Bonjour, je cherche depuis quelque jour un moyen de faire un formulaire de devis en php.

Dans les grandes lignes, tous mes articles sont stockés sur un BDD (libelle, prix, TVA, stock ...)
Et j'aimerais sur mon formulaire qu'une fois que la personne a choisis un article dans un menu déroulant toutes les autres informations s'affichent dans les inputs.

J'ai essayé avec Ajax, mais je suis débutant et je n'ai pas réussi.

Je vous montre mon code :

La parti html du formulaire :


 <td>
                                            <select name="article" id="article">
                                            <option value="">--Choisissez un article--</option>';
                                            <?php
                                                 $bdd = new PDO ('mysql:host=localhost;dbname=airfixation;charset=utf8', 'root', '');
                                                $articles = $bdd->query("SELECT * FROM t_article ORDER BY id");                                            
                                            foreach ($articles as $article):
                                            echo '<option value="'.$article['Libelle'].'">'.$article['Libelle'].'</option>';
                                            endforeach;
                                            ?>
                                            </select>                                            
                                        </td>
                                        <td>
                                            <input type="text" name="article" class="ajax">
                                        </td>
                                        <td>
                                            <input type="text" name="article" class="ajax">
                                        </td>
                                        <td>
                                            <input type="text" name="article" class="ajax">
                                        </td>
                                        <td>
                                            <input type="text" name="article" class="ajax">
                                        </td>


La parti PHP :

<?php

$article= $_POST['article'];
$informations = "";

$db = new mysqli('localhost', 'root', '', 'airfixation');
if ($db->connect_errno) {
    printf("Échec de la connexion : %s\n", $mysqli->connect_error);
    exit();
}

if ($result = $db->query("SELECT * FROM `t_article` WHERE `Libelle` = '$article'")) {
    
    while ($row = $result->fetch_array(MYSQLI_BOTH)) 
	{
        
        $informations[] = $row;
        
	}
    $result->close();
}
else
{
	printf("Message d'erreur : %s\n", $db->error);
}

$informations = $informations[0];

echo json_encode($informations);
?>


La parti JS


$(document).ready(function() {
                $('select#article').change(function() {
		var value = $(this).val();
                var i = 0;
		$.ajax({
		url: "traitement.php",
		type: "POST",    
        dataType: "JSON",
        data: {Libelle : value},

		success:function(data)
		{

                        $('input').each(function(){
		                 $(this).val(data[i])
				  i++;
			});
		}
	});

});
});


et lors du test de la parti PHP j'ai une erreur comme quoi " Chaîne non initialisée offset: 0 dans C: \ wamp64 \ www \ airfixation \ commercial \ traitement.php à la ligne 28"

En espérant que vous pourrez m'aider.
Modifié par Tilep (07 Aug 2020 - 15:31)
Bonjour,

A vue de nez, la seule variable non-initialisée que je vois est celle-ci :
printf("Échec de la connexion : %s\n", $mysqli->connect_error);

qui devrait être ré-écrit comme suit :
printf("Échec de la connexion : %s\n", $db->connect_error);


Par ailleurs, attention danger Smiley nono : il ne faut jamais utiliser l'utilisateur root dans un script PHP, même en développement. Vous prenez des risques inutiles sur vos données.

Enfin, plutôt que de poster des morceaux de fichiers, pouvez-vous poster les fichiers complets car sinon le numéro de ligne indiqué dans votre message d'erreur ne nous sera d'aucune aide pour vous répondre. Smiley cligne

Bien à vous,
Modifié par Bouchon (07 Aug 2020 - 15:52)
Salut,

Dans l'appel de l'ajax, tu passes en paramètre le nom 'Libelle', alors que dans le PHP, tu récupères $_POST['article']. Ta variable $article est donc vide et ta requête ne trouve rien.

Comme tu ne traites pas le cas où l'article n'est pas trouvé, $informations[0] n'existe pas. Par ailleurs, tu initialises $informations comme une chaîne, mais tu l'utilises comme un tableau. Il vaudrait mieux l'initialiser comme un tableau dans ce cas :
$informations = [];


Seul le premier résultat t'intéresse, donc ce n'est pas la peine de faire une boucle pour récupérer tous les résutlats. Puisque le libellé est censé être unique, la requête ne retourne de toutes façons que 0 ou 1 résultat. Tu peux donc tester si un résultat est trouvé et le récupérer directement sans faire de boucle.
Bonjour,
Grace a vos conseil j'ai pu faire afficher mes informations dans les champ input !
Mais pas les bon....
upload/1597206964-80728-2020-08-12082944-commandes.png
Il m'affiche les informations dans les premiers champs.
Pourtant dans mon JS j'ai bien mis

$('input.ajax').each(function(){
    $(this).val(data[i])
    i++;
});


et dans mon formulaire j'ai rajouter les class="ajax"