如果MySQL表不存在,则创建它。

7

我不怎么使用php/mysql,但我需要完成一个相对简单的任务:检查表是否存在,如果不存在则创建它。我甚至无法获得有用的错误消息,在数据库中也没有创建任何表格。我的语法显然有问题。

<?php

    session_start();
    error_reporting(E_ALL);
    ini_set('display_errors', 1);

    // 1. CONNECT TO THE DB SERVER, confirm connection
    mysql_connect("localhost", "root", "") or die(mysql_error());
    echo "<p>Connected to MySQL</p>";
    $mysql_connexn = mysql_connect("localhost", "root", ""); // redundant ?

    // 2. CONNECT TO THE SPECIFIED DB, confirm connection
    $db = "weighttracker";
    mysql_select_db($db) or die(mysql_error());
    echo "<p>Connected to Database '$db'</p>";
    $db_connexn = mysql_select_db($db)or die(mysql_error("can\'t connect to $db"));

    // 3. if table doesn't exist, create it
    $table = "WEIGHIN_DATA";
    $query = "SELECT ID FROM " . $table;
    //$result = mysql_query($mysql_connexn, $query);
    $result = mysql_query($query, $mysql_connexn);

    if(empty($result)) {
        echo "<p>" . $table . " table does not exist</p>";
        $query = "CREATE TABLE IF NOT EXISTS WEIGHIN_DATA (
            id INT NOT NULL AUTO_INCREMENT,
            PRIMARY KEY(id),
            DATE    DATE NOT NULL,
            VALUE   SMALLINT(4) UNSIGNED NOT NULL
        )"
    }
    else {
        echo "<p>" . $table . "table exists</p>";
    } // else

?>

2
mysql_*函数已经不再受支持,它们已经正式弃用不再维护,并将在未来被移除。为确保项目的功能性,您应该使用PDOMySQLi更新您的代码。 - Kermit
1
$db = weighttracker; 这行代码需要修改为 $db = "weighttracker";。 - Funk Forty Niner
此外,在查询中将 $table 用反引号括起来,因为表名包含连字符。很可能你想要进行数学运算 WEIGH-IN_DATA,这相当于 WEIGH (减) IN_DATA)。在你的文件开头(<?php 标签后面)添加错误报告:error_reporting(E_ALL); ini_set('display_errors', 1);,你就会明白我的意思了。 - Funk Forty Niner
哦,还有将变量 result = mysql_query($mysql_connexn, $query); 中的顺序调换 - 在 mysql_ 中,连接参数应该写在最后;不像 mysqli_ - Funk Forty Niner
@Kermit 谢谢你提醒我! - user1613163
显示剩余7条评论
2个回答

10
一些事情。
)" 的结尾和中间缺少了分号;
if(empty($result)) {
    echo "<p>" . $table . " table does not exist</p>";
    $query = "CREATE TABLE IF NOT EXISTS WEIGHIN_DATA (
        id INT NOT NULL AUTO_INCREMENT,
        PRIMARY KEY(id),
        DATE    DATE NOT NULL,
        VALUE   SMALLINT(4) UNSIGNED NOT NULL
    )" // <--- right there

这段代码可能会导致解析错误,例如:

解析错误:语法错误,意外的 '}' in...

还有其他错误,如你在最初发布的代码中所示。

此外,在表格创建中,您没有使用 mysql_query

以下是一个 mysqli_ 方法,我已经注释掉了您原来的代码。

顺便说一下:在 $query = "SELECT ID FROM " . $table; 中,您使用的是 ID 作为列名,但是您在创建表和列时使用的是小写的 id;两者必须匹配。

<?php

session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);

$DB_HOST = "xxx"; // put your own data
$DB_NAME = "xxx"; // put your own data
$DB_USER = "xxx"; // put your own data
$DB_PASS = "xxx"; // put your own data


$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
  die('Connection failed [' . $conn->connect_error . ']');
}



/*

    // 1. CONNECT TO THE DB SERVER, confirm connection
    mysql_connect("localhost", "root", "") or die(mysql_error());
    echo "<p>Connected to MySQL</p>";
    $mysql_connexn = mysql_connect("localhost", "root", ""); // redundant ?


    // 2. CONNECT TO THE SPECIFIED DB, confirm connection
    $db = "weighttracker";
    mysql_select_db($db) or die(mysql_error());
    echo "<p>Connected to Database '$db'</p>";
    $db_connexn = mysql_select_db($db)or die(mysql_error("can\'t connect to $db"));

    // 3. if table doesn't exist, create it
    $table = "WEIGHIN_DATA";
    $query = "SELECT ID FROM " . $table; // that should be id and not ID
    //$result = mysql_query($mysql_connexn, $query);
    $result = mysql_query($query, $mysql_connexn);


*/


    $table = "WEIGHIN_DATA";
    $query = "SELECT ID FROM " . $table; // that should be id and not ID
    //$result = mysql_query($mysql_connexn, $query); // your original code
    // however connection comes last in mysql method, unlike mysqli
    $result = mysqli_query($conn,$query);


if(empty($result)) {
    echo "<p>" . $table . " table does not exist</p>";
    $query = mysqli_query($conn,"CREATE TABLE IF NOT EXISTS WEIGHIN_DATA (
        id INT NOT NULL AUTO_INCREMENT,
        PRIMARY KEY(id),
        DATE    DATE NOT NULL,
        VALUE   SMALLINT(4) UNSIGNED NOT NULL
    )");
    }
    else {
        echo "<p>" . $table . "table exists</p>";
    } // else

?>

1
非常感谢。这个方法很有效。昨天我非常沮丧,因为我可以在 SequelPro 中创建表格,但我一直固执地试图让它在 php 的上下文中工作,而查询(如我在 SO 上找到的)就是不起作用。显然,语法有很多变化,所以感谢您提供面向对象的 SQL 查询方面的提示,这对我来说是新的。干杯,Shecky。 - user1613163
@user1613163,不用谢,我很高兴能帮到你,干杯 - 祝你编程愉快 :) - Funk Forty Niner
1
@PhilipWhitehouse 实际上,分号是必需的,否则会抛出错误,例如Parse error: syntax error, unexpected '}' in... - 当作为PHP执行时。 - Funk Forty Niner
@Fred-ii- 抱歉,我以为它是在谈论一个 SQL 语句。 :) - Philip Whitehouse

4
    CREATE TABLE IF NOT EXISTS WEIGH-IN_DATA (
        id INT NOT NULL AUTO_INCREMENT,
        PRIMARY KEY(id),
        DATE    DATE NOT NULL,
        VALUE   SMALLINT(4) UNSIGNED NOT NULL )

你确定 OP 的代码没有其他问题吗?(我发现了很多)此外,这个代码在失败状态 => WEIGH-IN_DATA <= 请看我的评论,特别是这一个 - Funk Forty Niner
如果你想要创建一个表,若不存在则新建,你可以使用"CREATE TABLE IF NOT EXIST",但是首先你必须检查数据库连接是否正确。也许错误在于数据库名称应该是一个字符串:$db = "weighttracker"; mysql_select_db($db) or die(mysql_error()); - Marcelo
谢谢@Marcelo。请查看我编辑过的问题,我已经应用了建议的更改,但仍然没有成功,没有错误消息,只有空白页面。 - user1613163

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接