【问题标题】:Inserting multiple rows into database using MySQL使用 MySQL 将多行插入数据库
【发布时间】:2012-10-12 21:01:03
【问题描述】:

我有以下代码将 1 行插入数据库:

public function fixed($fieldDay, $fieldNight) {

    $pdo = new SQL();
    $dbh = $pdo->connect(Database::$serverIP, Database::$serverPort, Database::$dbName, Database::$user, Database::$pass);

    $this->sql = "INSERT INTO tblfixedfare (SELECT NULL, MAX(FixedFareID)+1, '1', '$fieldDay' FROM tblfixedfare)";

try {
        // Query
        $stmt = $dbh->prepare($this->sql);

        $stmt->execute();

        $count = $stmt->rowCount();

        echo $count.' row(s) inserted by SQL: '.$stmt->queryString;

        $stmt->closeCursor();

    }

    catch (PDOException $pe) {
        echo 'Error: ' .$pe->getMessage(). 'SQL: '.$stmt->queryString;
        die();
    }

    // Close connection
    $dbh = null;
}

}

在执行此操作的同时,我想在同一张表中插入另一行:

$this->sql = "INSERT INTO tblfixedfare (SELECT NULL, MAX(FixedFareID)+1, '2', '$fieldNight' FROM tblfixedfare)";

我该怎么做呢?

编辑

另外,对于两个插入,MAX(FixedFareID)+1 的值必须是相同的值。

【问题讨论】:

  • 为什么不直接使用 Auto_increment?
  • 只需UNION 两个SELECT 语句。
  • 您正在使用准备好的语句,但您没有绑定任何参数,同时您将原始变量传递给查询?有点没有意义,不是吗?

标签: php mysql pdo


【解决方案1】:

将 SQL 查询定义更改为:

$this->sql = "
    INSERT INTO tblfixedfare 
        SELECT NULL, MAX(FixedFareID) + 1, '1', :fieldDay
        FROM tblfixedfare
        UNION
        SELECT NULL, MAX(FixedFareID) + 1, '2', :fieldNight
        FROM tblfixedfare
";

...并将execute() 调用更改为:

$stmt->execute(array(
    'fieldDay' => $fieldDay,
    'fieldNight' => $fieldNight
));

【讨论】:

  • 比如说MAX(FixedFareID)+1 = 5,这两个插入都使用值5吗?
  • @nsilva 是的。你还能期待什么?
  • 我刚试过这个,我得到以下信息: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在第 2SQL 行的 'SELECT NULL, MAX(FixedFareID)+1, '1', '100' FROM tblfixedfare), ' 附近使用正确的语法:INSERT INTO tblfixedfare VALUES (SELECT NULL, MAX(FixedFareID)+1, '1', '100' FROM tblfixedfare), (SELECT NULL, MAX(FixedFareID)+1, '2', '200' FROM tblfixedfare)
  • @nsilva 哦,是的,实际上你不能这样做,呃。试试INSERT INTO tblfixedfare (SELECT NULL, MAX(FixedFareID)+1, '1', '$fieldDay' FROM tblfixedfare UNION SELECT NULL, MAX(FixedFareID)+1, '2', '$fieldNight' FROM tblfixedfare) - 虽然还要注意 N.B. 对该问题的评论是有效的,但如果您只是将原始变量放入查询字符串中,则准备语句毫无意义 - 请改用占位符。
  • @nsilva Yeh 这也是错误的。我在这里过得不好是吗?在没有括号的情况下尝试:INSERT INTO tblfixedfare SELECT NULL, MAX(FixedFareID)+1, '1', '$fieldDay' FROM tblfixedfare UNION SELECT NULL, MAX(FixedFareID)+1, '2', '$fieldNight' FROM tblfixedfare - 这真的应该有效,我之前已经做过很多次了。
猜你喜欢
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2014-04-17
  • 2015-08-23
相关资源
最近更新 更多