【问题标题】:PHP PDO Check for multiple columns in mySQL table and create the ones that don't existPHP PDO 检查 mySQL 表中的多个列并创建不存在的列
【发布时间】: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 语句之前将它们从数组中删除。

标签: php mysql foreach pdo alter-table


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2017-05-09
    • 1970-01-01
    • 2012-01-06
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多