解决方案 »

  1.   

    数据插进去了么,异常信息打印出来看看,还有try 里面 嵌套try 似乎没有这种写法。
      

  2.   

    抱歉,是我糊涂了。
    异常信息大概是这样的:
    #0 /***************/pdo.php(23): PDOStatement->execute() #1 /****************/pdo.php(33): write('12345678', '87654321') #2 {main}
      

  3.   


    谢谢您指点,关于异常的处理,刚刚接触  :( 。
    异常,主要应该是$stmt->execute();那一句。以为对异常处理不熟悉,所以,还不大知道怎么打印更详细的异常信息。
      

  4.   


    代码如下:<?phpini_set('display_errors', '1');
    error_reporting(-1);define('DNS', 'mysql:host=localhost;dbname=ping_brand;charset=utf8mb4');
    define('USR', 'root');
    define('PWD', '123456');
    define('MAXLIFETIME', 1440);function write($id, $data) {
    try {
    $dbh = new PDO(DNS, USR, PWD, array(
    PDO::ATTR_PERSISTENT => TRUE,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => FALSE
    )); $expire = time() + MAXLIFETIME;
    $sql = 'INSERT INTO `session` (`skey`, `data`, `expire`) '
    . 'VALUES (:skey, :data, :expire) '
    . 'ON DUPLICATE KEY UPDATE '
    . '`data` = :data, `expire` = :expire';
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(':skey', $id, PDO::PARAM_STR);
    $stmt->bindValue(':data', $data, PDO::PARAM_STR);
    $stmt->bindValue(':expire', $expire, PDO::PARAM_INT);
    $stmt->execute();
    $dbh = NULL;
    } catch (Exception $e) {
    echo $e->getTraceAsString();
    }
    }write('12345678', '87654321');
    异常信息如下:
    #0 /Library/WebServer/Documents/php/phplearn/pdo.php(28): PDOStatement->execute() #1 /Library/WebServer/Documents/php/phplearn/pdo.php(35): write('12345678', '87654321') #2 {main}
      

  5.   

    你的 SQL 指令需要 5 个参数,而你只给了 3 个!
    echo $e->getTraceAsString();
    改为
    echo $e->getMessage() ;
    你就可以看到:
    Error!: SQLSTATE[HY093]: Invalid parameter numberPDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    启用异常处理模式
    注释掉就是按默认错误处理模式,可通过 errorInfo 取得错误信息PDO::ATTR_PERSISTENT => TRUE,
    启用长连接
    只在复用连接时会抛出异常
      

  6.   

    谢谢您的指点。代码修改成功了。$sql = 'INSERT INTO `session` (`skey`, `data`, `expire`) '
    . 'VALUES (:skey, :data, :expire) '
    . 'ON DUPLICATE KEY UPDATE'
    . '`data` = :data_updata, `expire` = :expire_updata';
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(':skey', $id, PDO::PARAM_STR);
    $stmt->bindValue(':data', $data, PDO::PARAM_STR);
    $stmt->bindValue(':expire', $expire, PDO::PARAM_INT);
    $stmt->bindValue(':data_updata', $data, PDO::PARAM_STR);
    $stmt->bindValue(':expire_updata', $expire, PDO::PARAM_INT);
      

  7.   

    头前以为,insert into 中的:data和on duplicate子句中的:data是同一个变量,只需要一个绑定呢。
    看起来不能这么做。关于原本的错误代码,为啥在初始化PDO对象的时候使用PDO::ATTR_PERSISTENT => TRUE,会导致异常呢?
    关于“复用连接”的说法,是啥地方构成了复用连接呢?再次感谢。