【问题标题】:How to check if column does not exist using PHP, PDO, MySQL?如何使用 PHP、PDO、MySQL 检查列是否不存在?
【发布时间】:2012-05-18 17:25:41
【问题描述】:

在我的应用程序中,我有一个适用于多个用户的通用查询。在某些情况下,用户之间的表结构可能不同。我有一个查询,我只想将其应用于表中存在该列的用户。

function get_item($user_id) {

    global $dbh;

    $sth = $dbh->query ("SELECT item_type FROM items WHERE user_id = '$user_id'");

    $row = $sth->fetch();

    $item_type = $row['item_type'];

    return $item_type;

}

如果我的表中不存在列“item_type”,我想忽略它,并将 $item_type 变量设置为 NULL。

对于这些用户,我在查询代码行中收到错误:

致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE [42S22]:找不到列:1054 中的未知列 'item_type' /item_display.php:5 中的“字段列表”

有什么想法吗?

【问题讨论】:

  • 能不能不要在桌子上做一个SELECT *,然后在PHP中检查$row['item_type']是否设置了?
  • 看看这个答案。 stackoverflow.com/a/7091984/212940
  • @andrewsi 如果我这样做,NULL 值(即未回答的值)不会区分那些与表中不存在的值。
  • 啊,确实如此 - 我不知道。另一方面,$row 会有一个 'item_type' 的键,所以你可以检查它是否存在?

标签: php mysql pdo


【解决方案1】:

我不知道它是否对你有帮助,但你可以试试这个:

if (count($dbh->query("SHOW COLUMNS FROM `items` LIKE 'item_type'")->fetchAll())) {
    $sth = $dbh->query ("SELECT item_type FROM items WHERE user_id = '$user_id'");
    $row = $sth->fetch();
    $item_type = $row['item_type'];
} else {
    $item_type = null;
}

它检查列是否存在并执行任务。

【讨论】:

  • +1,但这会使查询次数翻倍。所以应该小心使用,不要频繁使用。
  • 是的。我还在想这两个查询可以合并为一个,但目前无法检查。
【解决方案2】:

使用SHOW COLUMNS 查询:

SHOW COLUMNS FROM <table> WHERE Field = '<column>'

如果返回一行,则该列存在。

【讨论】:

    【解决方案3】:

    您还可以让 PDO 抛出异常并捕获这些异常以解析 MySQL 错误。

    /**
     * Enable PDO exceptions.
     * @see http://php.net/pdo.setattribute.php
     */
    $pdoObject->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    
    try
    {
        $pdoStatement->execute();
    }
    catch( PDOException $e )
    {
        switch( $e->errorInfo[1] )
        {
            case 1062:
                /* A PRIMARY or UNIQUE key is already assigned */
                return false;
            case 1054:
                /* Column not found */
                return false;
            default:
                /* some other PDO-error */
                log_error($e->getMessage(), 'mysql');
                return false;
        }
    }
    

    【讨论】:

      【解决方案4】:

      希望这会有所帮助。你可以用 PHP Mysql 做一些事情

      <?php
      
      $link = mysql_connect($server, $username,$password);
      
      if(!link))  
      {  
          exit('could not connect');  
      }
      
      if(!mysql_select_db($database))
      {  
          exit('could not select the database');  
      }
      $sql="SELECT * FROM myrow WHERE mycolumn='".$columname."'";
      $result=mysql_query($sql);
      if(!$result){
      if(mysql_errno($link)==1054){
                  //column does not exist
          echo "<br />available";
          }
      }
      elseif($nr= mysql_num_rows($result)){
          if ($nr > 0){
                          //column exist
              die('<br />name exists');
          }
      }
      else
      {
                  //column does not exist
          echo "<br />available";
      }
      ?>
      

      【讨论】:

      • 您正在寻找mycolumn 中的特定值,而不是查看mycolumn 是否存在。
      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多