php - 复制结构未知的 MySQL 行

标签 php mysql pdo duplicates

我正在尝试从技术上我一无所知的结构中复制一行。

这就是我到目前为止所拥有的。这段代码确实有效,但我很确定这不是最合适的。有人有更好的方法或正确的方法吗?如有任何建议,我们将不胜感激。

/*
   $table is the table name
   $id_field is the primary key
   $id_value is the row I want to copy
*/

$selectEntity = $dbh->prepare("SELECT * FROM {$table} WHERE {$id_field} = :id_value");
$selectEntity->execute(array(':id_value' => $id_value));
$entity = $selectEntity->fetch(PDO::FETCH_ASSOC);

foreach ($entity as &$value){ if(is_null($value) == true) { $value = "NULL"; } else { $value = "'".htmlspecialchars($value, ENT_QUOTES)."'"; } }

//remove the primary key
$entity[$id_field] = "'"; // the ' was the only way I could get NULL to get in there

$insertCloned = $dbh->prepare("INSERT INTO {$table} (".implode(", ",array_keys($entity)).") VALUES ('".implode(", ",array_values($entity)).")");
$insertCloned->execute();
$lastInsertedID = $dbh->lastInsertId();

非常困惑。

最佳答案

您的引用不正确 - 您在整个 VALUES 列表中都有引号,它们应该围绕每个单独的值。另外,您应该使用 $dbh->escape($value) 来转义值; htmlspecialchars 用于在您想要在网页上按字面显示 HTML 时对 HTML 进行编码。

但是最好使用查询参数而不是替换到 SQL 中。所以试试这个:

$entity[$id_field] = null;
$params = implode(', ', array_fill(0, count($entity), '?'));
$insertCloned = $dbh->prepare("INSERT INTO {$table} VALUES ($params)");
$insertCloned->execute(array_values($entity));

当值与表架构的顺序相同时,您无需在 INSERT 语句中列出列名。由于您首先使用 SELECT * 来获取值,因此它们将会是。

关于php - 复制结构未知的 MySQL 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23926437/

相关文章:

php - 使用 php 为子域设置 cookie 不起作用

php - 如果一个类不存在,你应该抛出哪个 PHP SPL 异常

php - 如何配置 Nginx 以将特定请求模式路由到托管 Symfony 应用程序的特定 php-fpm 上游?

python - mysql.connector.errors.ProgrammingError : 1083 (42000): Field separator argument is not what is expected

mysql - 在 MySQL 中存储配置的最佳方式

php - mysql select语句中的算术-内存大小错误

php - 如何将多个复选框结果存储到一个 mysql 表中

mysql - Yii2 将数据库表镜像到 redis 以实现高速事件记录查询

php - 无法使用 PDO 从 MySQL 中获取多行

php - 从 PHP 类中的数据库中获取数据