【问题标题】:Updating Database Using Javascript使用 Javascript 更新数据库
【发布时间】:2009-04-03 04:38:33
【问题描述】:

希望这将是我需要问的最后一个问题..lol.. 我不能离工作解决方案太远(希望..lol)。关于这个问题:

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

【问题讨论】:

  • 好吧,我不知道我是否会给我的第一条评论贴上恶意的标签,但我很抱歉。我的议程仍然完好无损。你有机会提出你的问题,而不是用“大声笑”来表达琐碎的感觉。我是在开玩笑,不是想贬低。真诚的道歉。
  • 您的评论显然对我的问题没有帮助。你是否喜欢我的写作方式,不是这里的主题……你同意吗?再说了,我一直都是这样写的……我觉得你是在歧视我的写作风格吗?我肯定会遵守 stackflow 礼节...
  • 我保持它干净,易于阅读。而且我没有看到其他人抱怨。我觉得奇怪,你竟然抽出一点时间来担心我的“lo-ing”。世界上没有更重要的事情让你担心吗?无论如何,我完成了..但不幸的是,仍然被冒犯了。

标签: php javascript jquery ajax


【解决方案1】:

哇,我从哪里开始。好的,我修复了你的代码。这是更改列表

  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 实际发生的成功条件对我来说是未知的。您将answercorrect 进行比较,但这段代码sn-p 并没有让我看到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>

【讨论】:

  • 谢谢你。我的编码很糟糕(笑)。但我仍在学习,并且是自学的,所以感谢您指出所有这些。好的,我从这条评论中复制了这个函数:stackoverflow.com/questions/638147/…
  • 但是你说的完全有道理,现在我正在查看它。你能建议你自己的解决方案吗?非常感谢您的帮助:)
  • 其他 cmets 建议使用复选框并隐藏提交按钮,但我对它们的含义有点困惑:stackoverflow.com/questions/712355/…
  • 好吧,不要试图通过随便复制/粘贴东西来完成这项工作。其他人的作品可以作为示例和参考,但如果你不了解其中的基本原理,那么你注定要熬夜。
  • 除了点击按钮,您知道在什么情况下您希望保存投票吗?不被拯救?
【解决方案2】:

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

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

【讨论】:

  • 好的,谢谢您的回复。我只是改变了它,所以这是一个问题了..lol。但我仍然遇到同样的问题。不过,谢谢你的回答。
【解决方案3】:

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

【讨论】:

  • 您好。我了解输入的清理,并且考虑到我在不到一个小时前才编写了这个代码,还有很多工作要做,包括清理。但是,一旦我真正让它工作,我就会做到这一点......并且在它上线到我的网站之前(它就在我的电脑上本地)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 2013-06-20
  • 2023-03-13
  • 2015-04-20
  • 2010-10-12
  • 1970-01-01
相关资源
最近更新 更多