克隆 table 行在 php 中失败,但通过 sql shell 成功

Cloning table row fails in php, but succeeds via sql shell

克隆 table 行出错了。你不会相信 codesnippet 2

对此感到抱歉。

因此,我正在尝试在包含大量列的 table 中克隆一个 table 行。当然,我不想为每一列命名。 我找到了一个解决方案,这在 mySQL WorkBench 接口中完美工作(sql shell) 。在这里,我使用 PK="TEST" 克隆行,我希望生成的行具有 "TEST1"

的 PK
CREATE TEMPORARY TABLE temp_tbl SELECT * FROM pianos WHERE pianoID = $oldPianoID;
UPDATE temp_tbl SET pianoID = '$newPianoID' WHERE pianoID = '$oldPianoID';
INSERT INTO pianos SELECT * FROM temp_tbl;
DROP TABLE temp_tbl;

但是当在 php 中应用此 sql-脚本时,它失败并给我以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE temp_tbl SET pianoID = 'TEST1' WHERE pianoID = 'TEST';
                INSERT INTO ' at line 2

同样,这适用于 shell,但不适用于我 运行 PHP5 和 MariaDB 10.0.23

的服务器

我认为使用 blob 存储的某些字段可能存在问题,但我无法理解这一点,因为它适用于 shell。

我是不是遗漏了什么明显的东西?

Carreful,你总是用简单的引用

您需要更改代码:

'UPDATE temp_tbl SET pianoID = 'TEST1' WHERE pianoID = 'TEST';

至:

'UPDATE temp_tbl SET pianoID = "TEST1" WHERE pianoID = "TEST"';

对于在 PHP 中的字符串中插入 var,您可以使用不同的可能性:双引号或 contactain

在双引号中,PHP解释代码,在单引号中没有。

Si,你可以这样写:

$sql = "UPDATE temp_tbl SET pianoID = '$var' WHERE pianoID = '$var2'";

或:

$sql = 'UPDATE temp_tbl SET pianoID = "'.$var.'" WHERE pianoID = "'.$var2.'"';

http://php.net/manual/en/language.types.string.php

$var  = 'test1';
$var2  = 'test';


echo "UPDATE temp_tbl SET pianoID = '$var' WHERE pianoID = '$var2'";
// show : UPDATE temp_tbl SET pianoID = 'test1' WHERE pianoID = 'test'

如果你看错误:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE temp_tbl SET pianoID = 'TEST1' WHERE pianoID = 'TEST';
                INSERT INTO ' at line 2

您正在尝试一次执行 2 个查询 - 您无法通过标准 mysqli::query() 执行此操作 - 您需要改用 mysqli::multi_query()

参见:http://php.net/manual/en/mysqli.multi-query.php

如果 newPianoId 不重要你可以使用这个 sql:

INSERT INTO pianos SELECT CONCAT(pianoID,UNIX_TIMESTAMP()), column1, column2, column3, ... FROM pianos WHERE 1

使用此 sql 您将使用新 ID 复制所有钢琴。请注意,您的 pianoID 列有足够的 space of UNIX_TIMESTAMP() 输出,至少我想尝试给出这个想法。

PS:如果不需要复制所有数据,可以使用 where 子句。喜欢

WHERE pianoID < 123456 AND create_date <= '2016-03-10'

等等