1
votes

L'appel Ajax n'affiche pas de réponse en cas de succès

J'essaie d'afficher dans un modal bootstrap l'image et les informations pertinentes d'une table de base de données mysqli nommée imprime, puis d'afficher dans le modal l'image, le titre, etc. l'appel ajax fonctionne et charge le div où la réponse devrait aller mais aucun des autres éléments de la réponse ne remplit le modal?

mon code est le suivant:

connexion à la base de données php: `

<?php
include "CreateDb.php";

$printinfo = 0;
if(isset($_POST['printinfo'])){
$printinfo = mysqli_real_escape_string($conn,$_POST['printinfo']);
}
$sql = "SELECT * FROM prints WHERE id =" .$printinfo;
$result = mysqli_query($conn,$sql);

$response = "<div class='modal-holder'>";

while( $prints = mysqli_fetch_array($result)){
$id = $prints['image'];
$image = $prints['image_href'];
$title = $prints['image_title'];

$response .= "<div>";
$response .= "<h1>".$title."</h1>";
$response .= "</div>";

$response .= "<div>";
$response .= "<img src=".$image_href.">";
$response .= "</div>";

}
$response .= "</div>";

echo $response;

?>

Cela se connecte sans erreur et est appelé en cas de besoin

Ma page principale où la base de données est utilisée pour afficher les vignettes de la table appropriée pour ensuite cliquer et utiliser une fenêtre contextuelle modale est la suivante:

<?php include 'CreateDb.php';
ini_set('display_errors', 'on');
error_reporting(E_ALL);
$SQLprintsall = 'SELECT * FROM prints';
$printsall = mysqli_query($conn, $SQLprintsall);

?>
<div id ="shop-header">
  <div id="cont-cart">
  <p>BUY PRINTS</p>
  <ul class="cart-actn">
    <li><a class="fa fa-pound-sign" href="#"></a></li>
    <li><a class="fa fa-shopping-cart" href="#"></a></li>
  </ul>
</div>
<ul class="shop-filters">
  <li class="filter-item">All</li>
  <li class="filter-item"><a href="#">Landscapes</a></li>
  <li class="filter-item"><a href="#">Animals</a></li>
  <li class="filter-item"><a href="#">Europe</a></li>
  <li class="filter-item"><a href="#">Scotland</a></li>
  <li class="filter-item"><a href="#">England</a></li>
  <li class="filter-item"><a href="#">Asia</a></li>
  <li class="filter-item"><a href="#">Canada</a></li>
</ul>
</div>
<!--thumbnail images Loop-->
<div id="shop-thumbs">
<?php while($prints = mysqli_fetch_array($printsall)) : ?>
<div id="image-shop" class="image-holder">
  <button type="button" data-id="<?php echo $prints['image']; ?>" class="img-btn btn-success 
printinfo" >
  <img src="<?=$prints['image_href']; ?>">
  </button>
</div>
<?php endwhile; ?>
<!-- Modal -->
<div class="modal fade" id="empModal" role="dialog">
<div class="modal-dialog">

 <!-- Modal content-->
 <div class="modal-content">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal">&times;</button>
  </div>
  <div class="modal-body">

  </div>
  <div class="modal-footer">
   <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
  </div>
 </div>
</div>
</div>
<script>

$(document).on('click', '.printinfo', function(){

 var printinfo = $(this).attr('data-id');
 alert("'.$printinfo.'");

 // AJAX request
 $.ajax({
  url: 'wp-content/themes/LEP/Modals/landscape-product-1.php',
  type: 'post',
  data: {printinfo: printinfo},
  success: function(response){
    console.log(printinfo);
    alert(response);
    // Add response in Modal body
    $('.modal-body').html(response);

    // Display Modal
    $('#empModal').modal('toggle');
  }
});
});

</script>

</div> <!-- end of containder from header.php -->

Cela appelle alors la fenêtre contextuelle modale qui est la suivante

     <?php
     $dbhost = '*';
     $dbuser = '*';
     $dbpass = '*';
     $dbname = '*';
     $conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);

     if(! $conn ) {
        die('Could not connect: ' . mysqli_error());
     }
     //echo 'Connected successfully';

  ?>

Tout fonctionne sur le clic mais le modal ne charge aucune des réponses en dehors du div qui contient les données de réponse?

Le site est comme ci-dessus à http://landscapephotoprints.co.uk

toute aide serait grandement appréciée

Merci beaucoup


5 commentaires

Recevez-vous l'alerte pop-up? alert(response);


@GrumpyCrouton oui les deux alertes, d'abord pour que je sache que le clic fonctionne, puis le deuxième allert affiche une boîte de dialogue avec le html du div qui devrait être entièrement rempli avec les données de réponse, la boîte de dialogue affiche <div class = 'modal -holder '> </div> puis empêchez les options de dialogue supplémentaires, il n'affiche aucune autre donnée


Salut, pouvez-vous simplement alert(printinfo) voir si son identifiant de données est correct?


Qu'avez-vous essayé de déboguer le problème? Est-ce un problème PHP ou jQuery?


c'était un problème avec les données que j'essayais de transmettre et la base de données ne se connectait pas pour trouver les informations pertinentes, donc plus un problème de sql que j'ai ensuite modifié mon approche pour utiliser json encoder pour obtenir les données plus facilement


3 Réponses :


1
votes

Le problème est la façon dont vous le faites, votre code après "Ceci appelle alors le pop-up modal qui est comme suit" n'est pas la façon de le faire.

Vous ne devriez jamais obtenir de code / balises HTML avec une requête Ajax. Vous ne devriez obtenir que les données «pures» et les intégrer avec javascript dans le DOM.

Le moyen idéal après le chargement de votre page PHP depuis le serveur est que vos requêtes JS Ajax n'obtiennent que des données non html en réponse, donc dans cet exemple, votre code html pour afficher la photo devrait déjà être dans le div au début, peut-être avec un pic idiot. Votre requête Ajax devrait simplement recevoir l'url de la photo (echo ($ picUrl) côté serveur) OU (encore mieux) plusieurs informations comme url + titre + description + place en JSON (créez simplement un tableau PHP côté serveur et utilisez JSON_ENCODE ($ myArray)).


Pour être honnête, JSON est probablement la voie à suivre pour pouvoir envoyer img url + toutes sortes d'autres informations à inclure dans votre modal.

Cela vous donnerait par exemple quelque chose comme ça {picSrc = "./img/pic043.png", title = "Great pic", date= "2020-11-18"} si vous encodez ce tableau:

 $.ajax({
  url: 'wp-content/themes/LEP/Modals/landscape-product-1.php',
  type: 'post',
  data: {printinfo: printinfo},
  success: function(response){
 
    $('#divImg').attr('src',response); // Here response would be for exemple "./img/pic043.png"

    // Display Modal
    $('#empModal').modal('toggle');
  }

Voir l'exemple détaillé ici: https://makitweb.com/return-json-response-ajax-using-jquery-php/


Pour faire simple et sans JSON comme dans votre exemple, votre requête Ajax à "wp-content / themes / LEP / Modals / landscape-product-1.php" devrait vous rendre l'url de l'image en réponse (ou dans le cadre de la réponse si vous utilisez JSON).

Vous devriez également avoir déjà inclus une image factice dans le corps modal comme ça:

 <div class="modal-body">
     <img src="./img/nopic.png" id="divImg">
 </div>

Alors maintenant, si votre appel Ajax vous donne l'url de l'image comme réponse, il vous suffit de faire ceci:

$result = [ "picSrc" => "./img/pic043.png", 
            "title" => "Great pic", 
            "date"=> "2020-11-18"];
header('Content-Type: application/json');
echo json_encode($result);

Et Boom !, vous devriez voir votre photo dans le modal en cliquant dans la galerie :)


1 commentaires

Merci Velome, cela a certainement beaucoup plus de sens en utilisant le tableau d'encodage json, que j'ai essayé brièvement dans une version précédente, mais en regardant ce que vous avez expliqué, je pense que je ne transmettais pas les données de la bonne manière en JSON pour renvoyer un utilisable, j'essaierai pendant le week-end de mettre en œuvre ce que vous avez suggéré, mais cela semble définitivement un pas dans la bonne direction. Merci encore



1
votes

J'ai révisé la demande AJAX d'origine pour transmettre correctement les données en tant qu'objets JSON, puis utiliser les données dans la fonction de réussite, plutôt que d'utiliser PHP pour afficher les réponses. Comme recommandé par Velome, j'ai emprunté la route JSON et j'ai trouvé une solution beaucoup plus rapide que d'essayer de modifier mes réponses PHP d'origine

 $printinfo = $_POST['printinfo'];

 $sql = "SELECT * FROM prints WHERE image ='".$printinfo."' LIMIT 1";
 $result = mysqli_query($conn, $sql);
 $return_arr = array();

 while($prints = mysqli_fetch_array($result)) : {


  $id = $prints['image'];
  $href = $prints['image_href'];
  $title = $prints['image_title'];

  $return_arr[] = array("id" => $id,
                  "href" => $href,
                  "title" => $title);


} endwhile;

$myJson = json_encode($return_arr);
echo $myJson;
exit;

Et changé la boucle while, sélectionnez et configurez le tableau à renvoyer

$(document).on('click', '.printinfo', function(){

 var printinfo = $(this).attr('data-id');
     imageinfo = $(this).find().closest('img').attr('src');
 alert(printinfo);
 $('.modal-h1').html('');
 // AJAX request
 $.ajax({
  url: 'wp-content/themes/LEP/Modals/landscape-product-1.php',
  type: 'post',
  dataType: 'json',
  data: { printinfo: printinfo},
  success: function(data){
    console.log(data);
    console.log(data[0].href);
    console.log(data[0].id);
    console.log(data[0].title);
    alert(data);
    $('.modal-header').prepend('<h1 class=modal-h1>' + data[0].title +'</h1>');
    $('#modimg').attr('src', data[0].href);

    $('#myModal').modal('toggle');
    // Display Modal
    }
});
});


0 commentaires

0
votes

Pour suivre le bon travail de Paul Stephen Davis, j'ajouterai quelques bonnes pratiques basées sur sa réponse / son code.

header('Content-Type: application/json'); // <=== Say "it's JSON data", so for exemple if you go to the url in your browser it's correctly formated/display.

$conn = mysqli_connect("localhost", "my_user", "my_password", "my_db"); // <=== It's not in your code but it's probably here IRL.

if (mysqli_connect_errno()) {  // If there is an error with database connection it will send Json {error: "Failed to connect to MySQL: The error msg here."} with error code 500 (Server Intarnal Error).
  http_response_code(500);
  echo json_encode(["error"  => "Failed to connect to MySQL: " . mysqli_connect_error()]);
  exit();
}

$printinfo = $_POST['printinfo'];

// Here we gonna use "Prepared Statement" so it's safer if someone is trying to do MySQL injection (aka: trying to insert stuff in the string with the variable to do unatended things).
$sql = "SELECT * FROM prints WHERE image = ? LIMIT 1"; // Put ? where the variable is.
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $printinfo); // Bind the value to the ?.
$stmt->execute();
$result = $stmt->get_result();

if (!$result) {  // If there is an error with query it will send Json {error: "Error with MySQL Query: The error msg here."} with error code 500 (Server Intarnal Error).
  http_response_code(500);
  echo json_encode(["error"  => "Error with MySQL Query: " . mysqli_error($conn)]);
  exit();
}

$return_arr = array();

while ($prints =  $result->fetch_assoc()) : {
    $id = $prints['image'];
    $href = $prints['image_href'];
    $title = $prints['image_title'];

    $return_arr[] = array(
      "id" => $id,
      "href" => $href,
      "title" => $title
    );
  }
endwhile;

mysqli_close($con); // It will close the database connection (it will still be close at the end of script but its "by principle").

$myJson = json_encode($return_arr);

if($myJson === false || is_null($myJson)){ // <=== We check if JSON encoding want wrong.
  http_response_code(500);
  echo json_encode(["error"  => "Error encoding JSON."]);
  exit();
}
echo $myJson;
exit;

Gardez à l'esprit que le message d'erreur natif de la base de données ne doit être envoyé que dans le mod dev / debug, pas en production car il peut révéler des informations importantes.

Gardez également à l'esprit que ce n'est pas la "manière brillante" de le faire, pour mieux le faire, vous pouvez utiliser un "try catch" et lancer une erreur dans le contrôle d'erreur, exemple:

if (mysqli_connect_errno ()) throw new Exception ("Impossible de se connecter à MySQL:". mysqli_connect_error ());


0 commentaires