复制结构未知的MySQL行

时间:2014-05-29 05:40:56

标签: 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();

非常混乱。

1 个答案:

答案 0 :(得分:1)

您的报价不正确 - 您在整个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 *来获取值,因此它们将是。