插入到DB有时不起作用(与PDO聊天,AJAX,长轮询)

时间:2014-06-28 16:31:05

标签: php sql pdo

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

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

第一个数字是我输入的消息,第一个“工作”意味着加载了用户ID,第二个nuber加载了ID,最后一个“工作”意味着消息被插入到数据库中但有时并不是(只是有时候)。

但在DB中我只有行,例如

1
2
4
缺少

和3,5,

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

$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;
}

INSERT功能

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";
    }
}