PHP PDO 检查 mySQL 表中的多个列并创建不存在的列
Posted
技术标签:
【中文标题】PHP PDO 检查 mySQL 表中的多个列并创建不存在的列【英文标题】:PHP PDO Check for multiple columns in mySQL table and create the ones that don't exist 【发布时间】:2012-08-19 06:37:21 【问题描述】:寻找一种方法来检查数据库中的表是否已与其所需的列组合在一起。
我构建了这个函数:
function verifydbtable($table,$fields)
global $fsdbh;
foreach($fields as $field => $type)
$verify = $fsdbh->prepare("ALTER TABLE `$table` ADD `$field` $type;");
$verify->execute();
return 1;
其中$table
是要更新的表,$fields
包含要检查的所有字段的数组。 $type
包含字段的类型,例如。 VACHAR(20)
.
该函数适用于每个字段,直到遇到已经存在的字段。然后它返回 false。
问题是它不会检查数组中的剩余列。我们如何让它继续检查剩余的字段。
因为如果一个列已经存在,它将返回一个错误#1060 - Duplicate column name 'subtitle'
,这是它应该做的。如果返回此错误,我们需要跳到数组中的下一项。
通俗地说,我们需要这个,但当然这不是一个 mysql 语句。
prepare("ALTER TABLE `$table` ADD IF NOT EXIST `$field` $type");
【问题讨论】:
您是否收到任何错误消息? 没有错误信息。该功能运行良好。问题是如果其中一个字段已经存在,则会返回错误:#1060 - Duplicate column name 'url'。然后整个函数返回false,而不是继续处理数组中的下一项。我们需要解决这个问题。有没有办法告诉它继续如果错误。 您可以在 INFORMATION_SCHEMA 数据库中检查表中已有的列名,并在尝试使用 alter 语句之前将它们从数组中删除。 【参考方案1】:您可以尝试为查询指定IGNORE
:
$fsdbh->prepare("ALTER IGNORE TABLE `$table` ADD `$field` $type;");
【讨论】:
不能解决问题。如果列已存在,SQL 将返回错误,然后退出函数而不是检查数组中的下一项。我们需要解决这个问题,以便即使它们是错误的,它也能继续运行。有什么想法吗? @RobinKnight 你能检查一下PDO::ATTR_ERRMODE
的设置吗?也许它会引发您必须捕获的异常。请参阅 prodigitalson 的回答。【参考方案2】:
使用try catch:
function verifydbtable($table,$fields)
global $fsdbh;
$errors = array();
foreach($fields as $field => $type)
$verify = $fsdbh->prepare("ALTER TABLE `$table` ADD `$field` $type;");
try
$verify->execute();
catch (PDOException $e)
// you might want to check and make sure its actually the right error
// but you can figure that out if when you need to do so
// we'll also store the field name in an array jsut in case we want to use it
$errors[] = $field;
return 1;
【讨论】:
以上是关于PHP PDO 检查 mySQL 表中的多个列并创建不存在的列的主要内容,如果未能解决你的问题,请参考以下文章
PHP、PDO、MySQL - 多个 INSERT 容易被注入? [复制]
带有条件检查的 PHP MySQL PDO TextArea Where 子句