Php 在MySQL数据库中更新包含388列的行

Php 在MySQL数据库中更新包含388列的行,php,mysql,pdo,Php,Mysql,Pdo,我在更新MySQL数据库中大约388列的表时遇到问题。插入新行效果很好,但更新现有行不行(我没有收到任何错误消息)。我也不太确定我使用的插入/提取 数据是最好的,因为我有一个很长的代码,这也是非常脆弱的错误。嗯,我相信这个问题可以解决得更好 这是我的密码: 如果我对这388个值中的每一个都使用这个代码呢 insert into $table (field, value) values (:name, :value) on duplicate key update value=:value2 帮

我在更新MySQL数据库中大约388列的表时遇到问题。插入新行效果很好,但更新现有行不行(我没有收到任何错误消息)。我也不太确定我使用的插入/提取 数据是最好的,因为我有一个很长的代码,这也是非常脆弱的错误。嗯,我相信这个问题可以解决得更好

这是我的密码:

如果我对这388个值中的每一个都使用这个代码呢

insert into $table (field, value) values (:name, :value) on duplicate key update value=:value2
帮助和改进的想法将是伟大的!谢谢

您可以使用“REPLACE-INTO”语句而不是insert,这样您只需打印一次数据 乙二醇

此外,为了改进php代码(使其更加防故障),我可能会创建一个包含所有变量的数组,然后根据这些值打印SQL语句

$values = array('id'=> $id, ....);
$columns = array();
$replaceValues = array();
$insertValues = array();
foreach ($values as $key => $value)
{
     $columns[] = "`$key`";
     $replaceValues[] = ":$key";
     $insertValues[":$key"] = $value;
}
$pdo = new PDO('mysql:host=xyz;dbname=xyz','xyz','xyz');
$statement = $pdo->prepare('REPLACE INTO `values` ('.implode(',',$columns).') VALUES ('.implode(',',$replaceValues).')');
$statement->execute($insertValues);

很难看到你的代码。。。你能把它缩短并共享吗?…减少列这不会有问题,但那些被删除的行可能是那些内部有问题的行?有388列的表设计得不好。您应该保持代码简单明了,这是如此大的表所不能做到的。你最好把那张桌子分成几张小一点的。我可以看到,还有许多列的副本。经过一些修改后,您将以3-5个表结束,每个表有5-10列。不要在代码中搜索bug,而是重新设计它。似乎您希望将所有内容都放在一个表中的一行中。假设你有博客——你会用“comment1,comment2,comment3,…comment100”这样的列制作表格,并在第100条评论后再添加100列吗?啊,好的。那么你建议max有多少列?我有388个值要存储:)5个表和10列是不够的。数据库规范化(在本例中是重构)在一些绝对数字中不容易解释。我同意消除重复列将使代码更具可读性,可能会提高性能(当您可以正确设置外键或至少设置索引时)。如果不希望,请仅修复此问题。我建议查看MySQL和PHP中的查询限制长度。最可能的情况是查询“太长”。或者MySQL库有一个限制。我会看你的代码,但那是空的。怎么会这样?它仍然使用PDOs插入机制,并且密钥由代码定义,而不是由请求定义。此外,在编写本文之后,在定义$values数组时,我修复了代码中的一个错误。如果这是事实,我将在这里尝试这个错误。谢谢你的帮助!拜托,代码中没有定义388列的数组。真的吗?没问题,请注意,我在定义$values数组时发现了另一个错误,它当然应该是一个带值的关联数组,而不是一个包含数组的数组@你的常识,我通常不这么认为,但这并不意味着它很容易被SQL注入。顺便说一句,$insertValues是多余的,因为$values也可以起作用
$values = array('id'=> $id, ....);
$columns = array();
$replaceValues = array();
$insertValues = array();
foreach ($values as $key => $value)
{
     $columns[] = "`$key`";
     $replaceValues[] = ":$key";
     $insertValues[":$key"] = $value;
}
$pdo = new PDO('mysql:host=xyz;dbname=xyz','xyz','xyz');
$statement = $pdo->prepare('REPLACE INTO `values` ('.implode(',',$columns).') VALUES ('.implode(',',$replaceValues).')');
$statement->execute($insertValues);