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 表中的多个列并创建不存在的列的主要内容,如果未能解决你的问题,请参考以下文章

从 mySQL 表中选择一列并检查验证

PHP、PDO、MySQL - 多个 INSERT 容易被注入? [复制]

如何计算 MySQL 表中的行数(PHP PDO)

带有条件检查的 PHP MySQL PDO TextArea Where 子句

php+mysql 请问:用pdo如何获取某个表中记录的数目?

php+mysql 请问:用pdo如何获取某个表中记录的数目?