【问题标题】:Unable to Create View from PHP but can from phpMyAdmin无法从 PHP 创建视图,但可以从 phpMyAdmin
【发布时间】:2019-03-12 07:25:49
【问题描述】:

我正在编写一个 PHP 安装脚本,它将在 MySQL 中创建所需的数据库、表和视图。当我在 Internet Explorer 中运行该脚本时,它会返回一个空白屏幕(如果没有错误,则符合预期)。

当我在 phpMyAdmin 中查看我的数据库时,我看到了所有表,但视图不存在。当我通过 phpMyAdmin 的 SQL 窗口运行相同的 CREATE VIEW SQL 语句时,视图按预期创建。

我在 SQL 方面有丰富的经验,但我对 PHP 和 phpMyAdmin 是全新的。为什么在表格创建时视图不会从 PHP 脚本创建?

PHP 脚本:

<html>
<head>
    <title>Install Flashcard Script</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link href='https://fonts.googleapis.com/css?family=Lato:300,400,700' rel='stylesheet' type='text/css'>
    <link href='custom.css' rel='stylesheet' type='text/css'>
</head>
<body>

    <?php
        $host = "localhost";
        $user = "root";
        $password = "";
        $database = "FLASHCARD";

        $mysqli = new mysqli($host, $user, $password) or die(mysqli_error($mysqli));
        $mysqli->query("DROP DATABASE IF EXISTS " . $database) or die($mysqli->error);
        $mysqli->query("CREATE DATABASE " . $database) or die($mysqli->error);

        $mysqli = new mysqli($host, $user, $password, $database) or die(mysqli_error($mysqli));

        $mysqli->query("CREATE TABLE COURSES (
                            COURSE_ID INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
                            COURSE_NAME VARCHAR(255) NOT NULL,
                            COURSE_DESC TEXT NOT NULL,
                            DATE_CREATED DATETIME NOT NULL,
                            CREATED_BY BIGINT(20)
                            )") or die($mysqli->error);

        $mysqli->query("CREATE TABLE COURSE_SUBJECTS (
                            SUBJ_ID INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                            COURSE_ID INT(6),
                            SUBJ_NAME VARCHAR(255) NOT NULL,
                            SUBJ_DESC TEXT,
                            DATE_CREATED DATETIME NOT NULL,
                            CREATED_BY BIGINT(20)
                            )") or die($mysqli->error);

        $mysqli->query("CREATE TABLE SUBJECT_DECKS (
                            DECK_ID INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                            SUBJ_ID INT(6) NOT NULL,
                            DECK_NAME VARCHAR(255) NOT NULL,
                            DECK_DESC TEXT,
                            DATE_CREATED DATETIME NOT NULL,
                            CREATED_BY BIGINT(20)
                            )") or die($mysqli->error); 

        $mysqli->query("CREATE VIEW DECK_VIEW AS
                            SELECT 
                                c.COURSE_ID,
                                cs.SUBJ_ID,
                                sd.DECK_ID,
                                c.COURSE_NAME,
                                c.COURSE_DESC,
                                cs.SUBJ_NAME,
                                cs.SUBJ_DESC,
                                sd.DECK_NAME,
                                sd.DECK_DESC
                            FROM COURSES c
                            LEFT JOIN COURSE_SUBJECTS cs ON cs.COURSE_ID = c.COURSE_ID
                            LEFT JOIN SUBJECT_DECKS sd on sd.SUBJ_ID = cs.SUBJ_ID
                            ORDER BY COURSE_NAME, SUBJ_NAME, DECK_NAME
                            )") or die($mysqli->error);

    ?>
    </body>
</html>

**编辑

我在CREATE VIEW 上遗漏了一条错误捕获语句。现在我在其中添加了它,它给了我以下错误消息:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 16 行的 ')' 附近使用正确的语法

第 16 行对应于$database = "FLASHCARD";。这是什么意思?

【问题讨论】:

  • 启用错误报告。您正在检查查询中的错误,除了最后一个。在上面加上mysqli_error($mysqli),看看有没有错误。
  • 我添加了它,它给了我这个错误:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 16。这对应于$database = "FLASHCARD"; 行。这告诉我什么?
  • 您在上一个查询中忘记了括号。编辑:试试CREATE VIEW DECK_VIEW AS ( SELECT
  • 顺便说一句,第 16 行不是你想的那样,它在查询中是因为缺少括号,而不是$database = "FLASHCARD";。行数来自 PHP/Query。
  • 不客气。

标签: php mysql phpmyadmin sql-view


【解决方案1】:

第 16 行不是您想的那样,而是查询本身。

您在最后一个查询中遗漏了一个括号,并且应该在该查询中也使用 mysqli_error($mysqli)

所以把里面的代码改成

CREATE VIEW DECK_VIEW AS ( SELECT...
                         ^ // right there

【讨论】:

  • 干杯! @SandPiper 是的,有时另一双眼睛会有所帮助,很高兴我能提供帮助。编辑:啊,你删除了评论,不用担心:-)
  • 或者,反过来——SELECT ... 周围不需要括号。
猜你喜欢
  • 1970-01-01
  • 2011-05-17
  • 2018-03-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多