检查表是否存在的SQL语法有什么错误?

时间:2016-06-23 19:06:19

标签: php mysql sql database syntax-error

我正在查询服务器并使用PHP迭代多个数据库,但由于某种原因,这个$sql2查询(我已经阅读过无数线程)会返回语法错误:

$res = mysqli_query($conn,"SHOW DATABASES");

if (!$res){
    // Deal with error
}

while ($d = mysqli_fetch_array($res)){

    $db = $d['Database'];

    $sql1 = "USE $db";
    $query1 = mysqli_query($conn, $sql1);

    if (!$query1){
        // Deal with error
    }

    $sql2 = "IF (EXISTS (SELECT *
                 FROM INFORMATION_SCHEMA.TABLE
                 WHERE TABLE_SCHEMA = '$db'
                 AND TABLE_NAME = 'appusers'))
             BEGIN
                 SELECT * FROM `appusers`
             END";

    $query2 = mysqli_query($conn, $sql2);

    if (!$query2){
        // Deal with error
    }
}

这是我收到的错误:

  

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在'IF附近使用正确的语法(EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLE WHERE TABLE_S'在第1行

我的MySQL服务器版本是5.6.27,我的PHP解释器是5.6

2 个答案:

答案 0 :(得分:2)

您不能将IF语句用作查询,仅在存储过程中使用。您需要执行两个单独的查询。

$sql = "SELECT COUNT(*) AS count
        FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = '$db'
        AND TABLE_NAME = 'appusers'";
$result = mysqli_query($conn, $sql) or die(mysqli_error($conn);
$row = mysqli_fetch_assoc($result);
if ($row['count'] != 0) {
    $sql2 = "SELECT * FROM appusers";
    $query2 = mysqli_query($conn, $sql2);
    ...
} else {
    // deal with error
}

答案 1 :(得分:0)

SQL中没有if(尽管mysql有function called if

显然,如果表存在,您希望运行查询。更常见的方法是尝试运行查询并检查您获得的错误是否表示该表不存在。

E.g。如果您在mysql命令行应用程序中运行查询,则可能会得到以下结果:

mysql> SELECT * FROM appusers;
ERROR 1146 (42S02): Table 'test.appusers' doesn't exist

您会看到两个代码:

  • 1146:内部mysql代码(通过mysqli_errno获取此内容)
  • 42S02:SQL标准错误状态(通过mysqli_sqlstate获取此信息)

在您的情况下,检查SQL状态可能会更好,因为它涵盖了更多的情况。例如,all of these mysql error codes map to SQL state 42S02

  • 1051 - 未知表'%s'
  • 1109 - %s中未知的表'%s'
  • 1146 - 表'%s。%s'不存在