使用Javascript更新数据库

时间:2009-04-03 04:38:33

标签: php javascript jquery ajax

希望这将是我需要问的关于这个问题的最后一个问题。大声笑..我不能在工作解决方案上走得太远(希望如此......)。参考这个问题:

Pass data to database using 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>

输出:

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

3 个答案:

答案 0 :(得分:10)

哇,我从哪里开始。好的,我修复了你的代码。这是一个变化列表

  1. 易读性的格式化代码(这里需要一些严格的纪律)
  2. 在查询中使用它们之前清理输入(防止SQL注入)
  3. 为关联数组键查找添加字符串分隔符(防止E_NOTICE错误)
  4. 在打印为HTML(防止XSS)之前将潜在危险值转义为
  5. 删除了尴尬的echo语句,并改为使用大型输出字符串的HTML模式
  6. 更新了javascript以使用$.post()代替$.get(),因为您从脚本顶部的$_POST数组中读取。
  7. 以下是代码:

    <?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的成功条件对我来说是未知的。您将answercorrect进行了比较,但此代码段不允许我查看correct的来源。进入updateScore()函数后,我可以看到answer是对单击的HTMLAnchorElement的引用 - 但是发送到correct的值的来源是什么?

    具体来说,我正在考虑这个粗体部分

    onclick =“updateScore(this,正确)”

    编辑!

    尝试使用此功能版本,在成功投票后更新链接

    <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 :(得分:1)

我注意到的第一件事是,在您的JavaScript代码中,您正在使用$.get执行Ajax请求,并且在您的PHP代码中,您需要一个POST变量if(isset($_POST['score']))

因此,如果您在服务器端使用POST变量,则应在客户端使用$.post

答案 2 :(得分:1)

你没有消毒你的输入。任何人,无论是否使用您的应用程序,都可以向您发送“分数”,您将轻松地将其放入您的数据库中。或者他们可以轻松地向您发送SQL注入攻击,通过分数发布字符串“1);一些攻击在这里;插入得分(score_count)值(2”;