【问题标题】:Inserting into DB sometimes doesn´t work (chat with PDO, AJAX, long polling)插入数据库有时不起作用(与 PDO、AJAX、长轮询聊天)
【发布时间】:2014-06-28 16:31:04
【问题描述】:

我的聊天使用长轮询从数据库获取消息(加载它们没有问题)。但我也有将消息插入数据库的脚本,但有时它不起作用......它只是没有插入行,但它说它已插入。

<?php
include_once "../conect.php";     
$sprava = $_POST['sprava'];       // received message 
session_start(); 
echo $sprava; 
$ja = $_SESSION['id'];
session_write_close();
$cas = time();

try { 
    $conn = new PDO($databaza, $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $query = "SELECT som FROM user WHERE id = :ja";
    $stmt = $conn->prepare($query);
    $stmt->bindValue(':ja', $ja, PDO::PARAM_STR);
    if ($stmt->execute()) echo "works ";
} 
catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

$row = $stmt->fetch(PDO::FETCH_ASSOC); 
$on = $row["som"];
echo $on;
if ($on == "") return 0;

try { 
    $conn = new PDO($databaza, $username, $password); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $query = "INSERT INTO chat (cas,text,od,pre) VALUES (:cas, :text, :od, :pre)"; 
    $stmt = $conn->prepare($query); 
    $stmt->bindValue(':cas', $cas, PDO::PARAM_STR); 
    $stmt->bindValue(':text', $sprava, PDO::PARAM_STR);
    $stmt->bindValue(':od', $ja, PDO::PARAM_STR);
    $stmt->bindValue(':pre', $on, PDO::PARAM_STR); 
    $stmt->execute();
    $affected_rows = $stmt->rowCount();
    if ($affected_rows == 1) echo " works";
}
catch(PDOException $e) { 
    echo 'ERROR: ' . $e->getMessage();} 
?>

我没有收到任何错误,并且输出仍处于应有的状态 例如

1 works 37 works
2 works 37 works
3 works 37 works
4 works 37 works
5 works 37 works 

第一个数字是我输入的消息,第一个“works”表示加载了用户 ID,第二个 nuber 加载了 ID,最后一个“works”表示该消息已插入 DB,但有时没有(只是偶尔)。

但在数据库中,我只有行,例如

1
2
4

还有 3、5 不见了

【问题讨论】:

  • pdo 错误告诉你什么?
  • 没有错误......它只是没有插入一些行
  • 我认为您应该重写所有内容,因为我发现您的代码中存在许多缺陷。我会说你写的 70% 的代码都是糟糕的代码,这就是问题所在。我可以这么说,因为我已经使用 PDO 创建了一个聊天脚本,但是我无法理解您的编写方式

标签: php sql pdo


【解决方案1】:

INSTEAD OF INSERT 触发器正在执行此操作。检查表的触发器。

【讨论】:

    【解决方案2】:

    $on 为空时返回 0,发生这种情况时不会插入数据

    如果您要在同一个脚本中选择 INSERT,那么我建议您拆分该逻辑,特别是如果 INSERT 取决于 SELECT 返回的内容。

    创建2个函数:

    选择函数

    function select_som($conn, $ja){
        try { 
            $query = "SELECT som FROM user WHERE id = :ja";
            $stmt = $conn->prepare($query);
            $stmt->bindValue(':ja', $ja, PDO::PARAM_STR);
            $success = $stmt->execute();
            if(!$success){
                echo "SELECT failed";
            }
            $row = $stmt->fetch(PDO::FETCH_ASSOC); 
            $on = $row["som"];
        catch(PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }
        return $on;
    }
    

    插入函数

    function insert_data($conn, $cas, $sprava, $ja, $on){
        try { 
            $query = "INSERT INTO chat (cas,text,od,pre) VALUES (:cas, :text, :od, :pre)"; 
            $stmt = $conn->prepare($query); 
            $stmt->bindValue(':cas', $cas, PDO::PARAM_STR); 
            $stmt->bindValue(':text', $sprava, PDO::PARAM_STR);
            $stmt->bindValue(':od', $ja, PDO::PARAM_STR);
            $stmt->bindValue(':pre', $on, PDO::PARAM_STR); 
            $stmt->execute();
            $affected_rows = $stmt->rowCount();
        }
        catch(PDOException $e) { 
            echo 'ERROR: ' . $e->getMessage();
        }
      return $affected_rows;
    } 
    

    用法:

    if(isset($_POST['sprava'])){
        include_once "../conect.php"; 
        //session
        session_start(); 
        $ja = $_SESSION['id'];
        session_write_close();
        //connection
        $conn = new PDO($databaza, $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        //get "$on"
        $on = select_som($conn, $ja);
        //insert
        if($on != ""){
            $cas = time();
            $sprava = $_POST['sprava'];
            $success = insert_data($conn, $cas, $sprava, $ja, $on);
            if($success==1){
                echo "INSERT Successful";
            }else{
                echo "INSERT Failed!!";
            }
        }else{
            echo "on is empty, cannot insert data";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 2011-07-15
      • 2015-03-05
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      相关资源
      最近更新 更多