【问题标题】:select interbase and insert to mysql show 1 record only选择 interbase 并插入到 mysql 仅显示 1 条记录
【发布时间】:2014-04-30 02:50:18
【问题描述】:

我尝试从另一台使用 interbase 的机器获取数据。我正在使用 PDO 将 interbase 值插入 Mysql。但只有一条记录插入到 mysql 中。为什么?

$stmt = "SELECT FIRST 10 TRIM(LINE_NAME) as LINE_NAME, TRIM(MODEL_NAME) as MODEL_NAME, TRIM(PROD_NO) as PROD_NO,
                        TRIM(LOT_SIZE_IN) as LOT_SIZE_IN,TRIM(START_SERIAL) as START_SERIAL, 
                        TRIM(SERIAL_NO_LOW) as SERIAL_NO_LOW, TRIM(SERIAL_NO_UP) as SERIAL_NO_UP, TRIM(PROD_DATE) as PROD_DATE 
                FROM DOC_TO";
    $sth = ibase_query($dbh, $stmt);

// CREATE AN ARRAY OF OBJECTS
if($sth === FALSE) {
    die(ibase_errmsg()); // TODO: better error handling
}

        while ($row = ibase_fetch_object($sth)) {
                $newvalues[] = $row;
                }

$dbh = new PDO('mysql:host=localhost;dbname=qdbase', 'root', 'JeinQA123');

$sql="TRUNCATE TABLE `schedule`";
$stmt = $dbh->query($sql);
if($stmt){echo "connected";}
else{echo "failed";}


// PREPARE A QUERY
$qry2 = "INSERT INTO schedule (line,model,lotno,qty,serial,seriallow,serialup,date ) 
                VALUES (:LINE_NAME, :MODEL_NAME, :PROD_NO,:LOT_SIZE_IN,:START_SERIAL,:SERIAL_NO_LOW,:SERIAL_NO_UP,:PROD_DATE)";
$stmt = $dbh->prepare($qry2);

// USE THE ARRAY OF OBJECTS
foreach ($newvalues as $obj)
{
    // BIND THE OBJECT PROPERTIES INTO THE QUERY
    $stmt->bindParam('LINE_NAME',   $obj->LINE_NAME);
    $stmt->bindParam('MODEL_NAME', $obj->MODEL_NAME);
    $stmt->bindParam('PROD_NO', $obj->PROD_NO);
    $stmt->bindParam('LOT_SIZE_IN', $obj->LOT_SIZE_IN);
    $stmt->bindParam('START_SERIAL', $obj->START_SERIAL);
    $stmt->bindParam('SERIAL_NO_LOW', $obj->SERIAL_NO_LOW);
    $stmt->bindParam('SERIAL_NO_UP', $obj->SERIAL_NO_UP);
    $stmt->bindParam('PROD_DATE', $obj->PROD_DATE); 

/*I try to add this inside foreach*/
    try
    {
        $stmt->execute();
    }

    // IF THERE IS AN EXCEPTION THROWN BY PDO
    catch (PDOException $exc)
    {
        // IF THE EXCEPTION NUMBER IS NOT "DUPLICATE UNIQUE"
        if ($exc->errorInfo[1] != 1062)
        {
            $msg = "FAIL: $qry " . PHP_EOL . $exc->getmessage();
            trigger_error($msg, E_USER_ERROR);
        }
    }
}

【问题讨论】:

  • 等等,现在您想忽略违反唯一约束的行为吗?为什么一开始不提这个?
  • 看起来您还没有将 PDO 设置为实际抛出异常,因此在发生错误时不会捕获任何异常。请参阅下面的更新答案

标签: php mysql pdo insert interbase


【解决方案1】:

试试下面的

// make sure PDO is set to throw exceptions
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $dbh->prepare($qry2);

foreach ($newvalues as $obj) {
    try {
        $stmt->execute(array(
            ':LINE_NAME'     => $obj->LINE_NAME,
            ':MODEL_NAME'    => $obj->MODEL_NAME,
            ':PROD_NO'       => $obj->PROD_NO,
            ':LOT_SIZE_IN'   => $obj->LOT_SIZE_IN,
            ':START_SERIAL'  => $obj->START_SERIAL,
            ':SERIAL_NO_LOW' => $obj->SERIAL_NO_LOW,
            ':SERIAL_NO_UP'  => $obj->SERIAL_NO_UP,
            ':PROD_DATE'     => $obj->PROD_DATE
        ));
    } catch (PDOException $e) {
        $errorInfo = $stmt->errorInfo();
        if ($errorInfo[1] != 1062) {
            throw $e;
        }
    }
}

我不完全确定 1062 是要检查的错误代码。过去,我使用1586 来检测唯一约束违规。反复试验会发现要检查的正确值。

您还使用$stmt->errorInfo 作为属性而不是方法$stmt->errorInfo()

【讨论】:

  • 显示错误PHP Parse error: syntax error, unexpected '[', expecting ')'
  • @nunu 您显然使用的是相当旧的 PHP 版本。速记数组语法出现在 5.4 中。我已经更新了我的答案以支持旧语法
  • 我尝试执行,看看我更新的问题。更改更新后的答案后仍然出现相同的错误。
  • @nunu 您是否将 PDO 设置为抛出异常(参见上面的第一行代码)?尝试在没有 try 语句和 catch 块的情况下运行它。还要确保在 php.ini 文件中设置了 error_reporting = E_ALLdisplay_errors = On
  • @nunu 我从 accept 中假设你让它工作了。恭喜:)
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多