Обновление базы данных с использованием Javascript - PullRequest
2 голосов
/ 03 апреля 2009

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

Передача данных в базу данных с использованием JavaScript Onclick

Я пытаюсь передать значение в базу данных, используя JavaScript. Ниже приведен код, который я использую. И только для наглядности я включил скриншот того, что это выводит. Надеюсь, это поможет объяснить, чего я пытаюсь достичь. Проблема в том, что у меня есть ссылка на голосование «Голосование» на JavaScript, в общем-то, ничего не делает ... смеется, вы нажимаете на нее, и ничего не происходит. Желательно, чтобы текст ссылок просто изменился на «Вы проголосовали!» после того, как ссылка нажата, и данные отправлены / получены, но предупреждение будет в порядке, если я смогу заставить его работать и обновлять базу данных.

Спасибо всем:)

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

Выходы:

альтернативный текст http://www.freeimagehosting.net/uploads/a7185475b8.png

Ответы [ 3 ]

10 голосов
/ 03 апреля 2009

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

  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, но этот фрагмент кода не позволяет мне увидеть, откуда берется 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>
1 голос
/ 03 апреля 2009

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

1 голос
/ 03 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...