Mise à jour de la base de données en utilisant Javascript

J'espère que ce sera la dernière question dont je dois poser à propos de ce … lol .. Je ne peux pas être trop loin de la solution de travail (j'espère … lol). En référence à cette question:

Passer des données à la base de données en utilisant javascript Onclick

J'essaie de transmettre une valeur à la base de données en utilisant javascript. Voici le code que j'utilise. Et juste pour l'aide visuelle, j'ai inclus une capture d'écran de ce que cela produit. J'espère qu'il aidera à expliquer ce que j'essaie d'atteindre aussi. Le problème que j'avais est le javascript Le lien "Vote" ne fait presque rien … lol … vous cliquez dessus, et rien ne se passe. De préférence, j'aimerais que le texte des liens passe simplement à "Vous avez voté!" Une fois que le lien a été cliqué et que les données ont été envoyées / reçues, mais une alerte sera bien faite, pourvu que je puisse fonctionner et mettre à jour la base de données.

Merci tout le monde:)

<?php if(isset($_POST['score'])) { mysql_query("INSERT INTO score (score_count) VALUES ($_POST[score])"); } $user_id = uid(); $m = mysql_query("SELECT * FROM friends WHERE friend_user_id1 = '$user_id' AND friend_status != '0' LIMIT 15"); while ($t = mysql_fetch_array($m)) { $fid = $t[friend_user_id2]; $f = mysql_query("SELECT * FROM users WHERE user_status != '' AND user_status_date != '0' AND user_id = '$fid' ORDER BY user_status_date ASC LIMIT 15") or die(mysql_error()); while ($rows = mysql_fetch_array($f)) { $date = parse_date($rows[user_status_date]); echo "<div style='margin: 5px;'><table><tr><td valign='top' style='width:55px;'><a href='page.php?id=$rows[user_username]'>"; _photo($rows[user_id]); echo '</a></td><td valign="top"> <a href="page.php?id='.$rows[user_username].'" class="blue"><b>'.$rows[user_username].'</b></a> - <span style="font-size:7pt;">'.$date.'</span><span style="font-size:7pt;"> - <a href="javascript:(void);" onclick="updateScore(this, correct)" class="blue">Vote</a></span> <br />'.$rows[user_status].'</td><td valign="top"></td></tr></table></div>'; } } ?> <script type="text/javascript"> function updateScore(answer, correct) { if (answer == correct) { $.get('index.php', {'score': '1'}, function(d) { alert('Vote Accepted: ' + d); }); } } </script> 

Les sorties:

Alt text http://www.freeimagehosting.net/uploads/a7185475b8.png

Où puis-je commencer. Ok, j'ai réparé votre code. Voici une liste des changements

  1. Code formaté pour la lisibilité (vous avez besoin d'une discipline sérieuse ici)
  2. Entrées sanitizées avant de les utiliser dans les requêtes (empêche l'injection SQL)
  3. Des délimiteurs de chaîne ajoutés aux recherches de la table virtuelle associative (empêche les erreurs E_NOTICE)
  4. Échappé des valeurs potentiellement dangereuses avant d'imprimer en HTML (empêche XSS)
  5. Supprime echo instructions d' echo maladroites et changé en mode HTML pour les grandes chaînes de sortie à la place
  6. Mise à jour javascript pour utiliser $.post() au lieu de $.get() depuis que vous lisez à partir du tableau $_POST en haut du script.

Voici le code:

 <?php if ( isset( $_POST['score'] ) ) { $result = mysql_query( "INSERT INTO score (score_count) VALUES (" . mysq_real_escape_string( $_POST['score'] ) . " )" ); echo $result ? 'Vote Succeeded' : 'Vote Failed: ' . mysql_error(); exit; } $user_id = mysql_real_escape_string( uid() ); $m = mysql_query( "SELECT * FROM friends WHERE friend_user_id1 = '$user_id' AND friend_status != '0' LIMIT 15" ); while ( $t = mysql_fetch_array( $m ) ) { $fid = mysql_real_escape_string( $t['friend_user_id2'] ); $f = mysql_query( "SELECT * FROM users WHERE user_status != '' AND user_status_date != '0' AND user_id = '$fid' ORDER BY user_status_date ASC LIMIT 15" ) or die ( mysql_error() ); while ( $rows = mysql_fetch_array( $f ) ) { $date = parse_date( $rows['user_status_date'] ); ?> <div style="margin: 5px;"> <table> <tr> <td valign="top" style="width:55px;"> <a href="page.php?id=<?php echo escapeForHtml( $rows['user_username'] ); ?>"> <?php _photo( $rows['user_id'] ); ?> </a> </td> <td valign="top"> <a href="page.php?id=<?php echo escapeForHtml( $rows['user_username'] ); ?>" class="blue"> <b><?php echo escapeForHtml( $rows['user_username'] )?></b> </a> - <span style="font-size:7pt;"><?php echo escapeForHtml( $date )?></span> <span style="font-size:7pt;"> - <a href="javascript:;" onclick="updateScore(this)" class="blue">Vote</a></span> <br /><?php echo escapeForHtml( $rows['user_status'] ); ?></td><td valign="top"> </td> </tr> </table> </div> <?php } } function escapeForHtml( $value ) { return htmlspecialchars( $value, ENT_COMPAT, 'UTF-8' ); } ?> <script type="text/javascript"> function updateScore(answer, correct) { if (answer == correct) { $.post('index.php', {'score': '1'}, function(d) { alert('Vote Accepted: ' + d); }); } } </script> 

Après avoir fait tout cela, je pourrais alors voir clairement que votre condition de réussite pour que le POST ait effectivement lieu soit inconnue pour moi. Vous comparez la answer à correct mais cet extrait de code ne me permet pas de voir d'où vient le code. Une fois dans la fonction updateScore() , je peux voir que cette answer est une référence au HTMLAnchorElement qui a été cliqué – mais quelle est la source de la valeur envoyée dans correct ?

Pour être précis, je prends cette partie en gras ici

Onclick = "updateScore (ceci, correct )"

Modifier!

Essayez ceci pour une version de votre fonction qui met à jour le lien après un vote réussi

 <script type="text/javascript"> function updateScore( answer ) { if ( confirm( "Are you sure?" ) ) { $.post('index.php', {'score': '1'}, function(d) { alert('Vote Accepted: ' + d); $(answer).after("<span>You Voted!</span>").remove(); }); } } </script> 

La première chose que je constate, dans votre code JavaScript, vous faites la demande Ajax avec $.get et dans votre code PHP, vous vous attendez à une variable POST if(isset($_POST['score'])) .

Donc, si vous utilisez des variables POST du côté serveur, vous devez utiliser $.post du côté client.

Vous ne désinfectez pas vos intrants. Toute personne, utilisant votre application ou non, pourrait vous envoyer un "score", et vous l'ajouterez volontairement dans votre base de données. Ou ils pourraient aussi vous envoyer une attaque par injection SQL, en affichant avec le score la chaîne "1); certains attaquent ici, insérez dans le score (score_count) les valeurs (2";