【问题标题】:Ajax and Mysql Inserting 2 same row for one clickAjax和Mysql一键插入2行
【发布时间】:2013-06-25 18:27:34
【问题描述】:

我有一个 button 属性 onclick 来启动 javascipt 函数,我的 javascript ajax 脚本有 xmlhttp 对象。它正在与dbaction.php通信

当我单击按钮时,脚本和 mysql 一切正常,但问题在于行。 It is inserting TWO same row for each click until it rowCount>0 当第一次点击后回显打印"0"rowCount(),那么如果我再次点击现在回显打印"2"rowCount()

问题出在哪里?

<body>

<script type="text/javascript">

function loadName() {
    var xmlhttp;
    xmlhttp = new XMLHttpRequest();

    xmlhttp.onreadystatechange = function()
    {
        if (xmlhttp.readyState === 4 && xmlhttp.status === 200)
        {
            document.getElementById("sample_div").innerHTML = xmlhttp.responseText;

            $("#my_button").attr("value", "Sent");
            $("#my_button").attr("style", "color:red;");
        }
    };
    xmlhttp.open("GET", "dbaction.php?sender_id=5&receiver_id=6", true);
    xmlhttp.send();
}
  </script>

<input type="submit" id="buton" onclick="loadName();" value="Submit"/>
 <div id="sample_div" style="background-color: khaki; width:50%; margin: 0 auto;">     
 </div> 
 </body>

dbaction.php

<?php
//Database connection using PHP PDO(php database objects)
try {
$db = new PDO("mysql:dbname=member;host=localhost", "root", "",    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
 } 
catch ( PDOException $e ) {
echo $e->getMessage();
}

$sql= "SELECT * FROM friendship WHERE sender_id=".$_GET["sender_id"]." AND    receiver_id=".$_GET["sender_id"]."";
$rs=$db->prepare($sql);
$rs->execute();
$rs->fetch();
$count = $rs->rowCount();

if ($count>0){
 echo "You already sent request...";
 echo $count;
}
else {
$query = $db->query("INSERT INTO friendship (sender_id, receiver_id, is_approved) VALUES (".$_GET["sender_id"].",".$_GET["receiver_id"].",0)" );
$query->execute();

echo "Request sent";
echo $count;
}

【问题讨论】:

  • 检查您的控制台面板,看看是否只发送了一个请求,我认为loadName() 调用了两次
  • 控制台面板是什么意思?如何监控它?
  • firefox浏览器的控制台面板有一个插件firebug安装并检查
  • 如果您使用的是Google Chrome,请在单击input 之前按f12(它将打开Developer tools)并单击Network 选项卡。

标签: php mysql ajax jquery pdo


【解决方案1】:

检查差异:-

<?php
//Database connection using PHP PDO(php database objects)
try {
$db = new PDO("mysql:dbname=member;host=localhost", "root", "",          array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
 } 
catch ( PDOException $e ) {
 echo $e->getMessage();
}

$sql= "SELECT * FROM friendship WHERE sender_id=".$_GET["sender_id"]." AND       receiver_id=".$_GET["sender_id"]."";
$rs=$db->prepare($sql);
$rs->execute();
$rs->fetch();
 $count = $rs->rowCount();

if ($count>0){
 echo "You already sent request...";
 echo $count;
 }
  else {
 $query = $db->query("INSERT INTO friendship (sender_id, receiver_id, is_approved) VALUES (".$_GET["sender_id"].",".$_GET["receiver_id"].",0)" );
 //$query->execute();

   echo "Request sent";
   echo $count;
}

在最后一个else块中,您同时使用query()和execute(),用于直接执行sql查询一个query(),execute()用于准备好的语句

【讨论】:

【解决方案2】:

就像@dianuj 在他的评论中所说,如果你在console 中同时看到两个请求,那么像下面这样更改你的js function

<script type="text/javascript">
  var in_request  = false;
  function loadName() {
    if ( in_request ) {
      return false;
    }
    in_request  = true;
    var xmlhttp;
    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange  = function() {
      if ( xmlhttp.readyState === 4 && xmlhttp.status === 200 ) {
        in_request  = false;
        document.getElementById( "sample_div" ).innerHTML = xmlhttp.responseText;
        $("#my_button").attr( "value", "Sent" );
        $("#my_button").attr( "style", "color:red;" );
      }
    };
    xmlhttp.open( "GET", "dbaction.php?sender_id=5&receiver_id=6", true );
    xmlhttp.send();
  }
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2018-01-07
    • 2014-01-26
    • 2012-08-30
    • 2023-03-11
    相关资源
    最近更新 更多