Обновление базы данных с помощью Javascript

Надеюсь, это будет последний вопрос, который мне нужно задать об этом … .. Я не могу слишком далеко от рабочего решения (надеюсь, …). В связи с этим вопросом:

Передача данных в базу данных с помощью javascript Onclick

Я пытаюсь передать значение в базу данных с помощью javascript. Ниже приведен код, который я использую. И только для визуальной помощи, Ive включил скриншот того, что это выводит. Надеюсь, это поможет объяснить, к чему они стремятся. Проблема, связанная с тем, что ссылка javascript «Vote» в значительной степени ничего не делает … lol … u щелкните по ней, и ничего не происходит. Я бы хотел, чтобы текст ссылок просто изменился на «You Voted!». после того, как ссылка была нажата, и данные отправлены / получены, но предупреждение будет прекрасным, если я могу заставить это работать и обновлять базу данных.

Всем спасибо:)

<?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> 

Выходы:

alt text http://img.ruphp.com/php/www.freeimagehosting.net

Вау, с чего мне начать. Хорошо, я исправил ваш код. Вот список изменений

  1. Отформатированный код для удобочитаемости (здесь вам нужна какая-то серьезная дисциплина)
  2. Санитарные входы перед использованием их в запросах (предотвращает SQL-инъекцию)
  3. Добавлены разделители строк для поиска ключей ассоциативного массива (предотвращает ошибки E_NOTICE)
  4. Удаленные потенциально опасные значения перед печатью как HTML (предотвращает XSS)
  5. Удалены неуклюжие выражения echo и вместо этого изменены в режим HTML для больших выходных строк
  6. Обновлен javascript, чтобы использовать $.post() вместо $.get() поскольку вы читаете из массива $_POST в верхней части скрипта.

Вот код:

 <?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> 

После того, как я сделал все, что сделал, я мог тогда ясно видеть, что ваше условие успеха для POST действительно имеет место, неизвестно мне. Вы сравниваете answer с correct но этот фрагмент кода не позволяет мне видеть, откуда исходит. Как только внутри функции updateScore() я вижу, что этот answer является ссылкой на HTMLAnchorElement, который был нажат, но каков источник для correct ?

Чтобы быть конкретным, я занимаюсь этой смелой частью здесь

onclick = "updateScore (это, правильно )"

Редактировать!

Попробуйте это для версии вашей функции, которая обновляет ссылку после успешного голосования

 <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> 

Первое, что я заметил, в вашем JavaScript-коде вы делаете запрос Ajax с $.get , и в вашем PHP-коде вы ожидаете переменную POST, if(isset($_POST['score'])) .

Итак, если вы используете переменные POST на стороне сервера, вы должны использовать $.post на стороне клиента.

Вы не дезинфицируете свои входы. Любой, используя ваше приложение или нет, мог бы отправить вам «оценку», и вы будете blithely положить его в свою базу данных. Или они могут так же легко отправить вам инъекцию SQL-инъекции, отправив с оценкой строку «1», некоторые атаки здесь, вставить в score (score_count) значения (2 ";