Php PDO无法将行移动到其他数据库

Php PDO无法将行移动到其他数据库,php,mysql,pdo,Php,Mysql,Pdo,我决定试试PDO。下面的函数应该将表中的行移动到另一个数据库(从暂存到生产),然后删除暂存中的行。它是两个完全分离的数据库 我能够获取该行并将其插入到生产数据库中,但它不会删除临时数据库中的该行,并且会给我一个错误,说该行的id字段名343不正确,我不确定为什么它认为它是字段名,而它实际上是值 也请随时给我更好的最佳实践。我不认为我的代码是优雅的,我认为有更好的方法可以做到这一点,特别是在例外情况下 private function moveCallToProduction() { t

我决定试试PDO。下面的函数应该将表中的行移动到另一个数据库(从暂存到生产),然后删除暂存中的行。它是两个完全分离的数据库

我能够获取该行并将其插入到生产数据库中,但它不会删除临时数据库中的该行,并且会给我一个错误,说该行的id字段名343不正确,我不确定为什么它认为它是字段名,而它实际上是值

也请随时给我更好的最佳实践。我不认为我的代码是优雅的,我认为有更好的方法可以做到这一点,特别是在例外情况下

 private function moveCallToProduction() {
    try {
        $array = array(":id" => $this->call['info']['call_id']);
        $sql = "SELECT * FROM `calls` WHERE `id`=:id";
        $query = $this->staging->prepare($sql);
        $query->execute($array);
        $row = $query->fetch(PDO::FETCH_NUM);
        try {
            $sql = "INSERT INTO `calls` (`id`,`sip_id`,`extension`,`caller_id`,`stage`,`status`,`survey_id`,`start`,`answer`,`hangup`) VALUES (`?`,`?`,`?`,`?`,`?`,`?`,`?`,`?`,`?`,`?`)";
            $stmt = $this->production->prepare($sql);
            $stmt->execute($row);
            if(!$stmt) {
                throw new Exception('Unable to move the call '.$this->call['info']['call_id'].' to the production server.');
            } else {
                try {
                    $sql = "DELETE FROM `calls` WHERE `id`='".$this->call['info']['call_id']."'";
                    $query = $this->staging->query($sql);
                    if(!$query) {
                        throw new Exception('Unable to delete call '.$this->call['info']['call_id'].' from the staging server.');
                    }
                }
                catch(PDOException $e) {
                   $this->informer("FATAL",$e->getMessage());
                }
            }

        }
        catch(Exception $e) {
            $this->informer("FATAL",$e->getMessage());
        }
    }
    catch(PDOException $e) {
        $this->informer("FATAL","We're unable to transport the call from the staging to production server. Error: ".$e->getMessage());
    }
}

我认为这是一个逃避问题

试试这个:

...
try {
    $sql = "DELETE FROM `calls` WHERE `id`= :id";
    $stmtx = $this->staging->prepare($sql);
    $stmtx->execute(array($this->call['info']['call_id']));
    if(!query) {
...

我认为这是一个逃避问题

试试这个:

...
try {
    $sql = "DELETE FROM `calls` WHERE `id`= :id";
    $stmtx = $this->staging->prepare($sql);
    $stmtx->execute(array($this->call['info']['call_id']));
    if(!query) {
...

尝试
echo
调用
$sql
变量并查看它包含的内容。还有一件事,您是否必须将id值用单引号括起来?原因是程序员将准备好的语句和简单的查询混为一谈。我想这是一个转义问题,因为所有其他(准备好的)语句都可以工作。请尝试
回送
$sql
变量,看看它包含什么。还有一件事,您是否必须将id值用单引号括起来?请注意程序员将准备好的语句和普通查询混淆了。我想这是一个逃避问题,因为所有其他(准备好的)陈述都是有效的。你的答案是最接近的。这实际上是insert语句中的一个转义问题。
问号是不正确的,看起来驱动程序认为
是一个字段名。是的,我明白了。问号用“`”括起来,这是错误的。你的答案是最接近的。这实际上是insert语句中的一个转义问题。
问号是不正确的,看起来驱动程序认为
是一个字段名。是的,我明白了。问号用“`”括起来,这是错误的。