Невозможно создать представление из PHP, но можно из phpMyAdmin

Я работаю над сценарием установки PHP, который создаст необходимую базу данных, таблицы и представления в MySQL. Когда я запускаю скрипт в Internet Explorer, он возвращает пустой экран (как и ожидалось, если бы не было ошибок).

Когда я смотрю на свою базу данных в phpMyAdmin, я вижу все таблицы, но представление не существует. Когда я запускаю тот же оператор CREATE VIEW SQL через окно SQL phpMyAdmin, представление создается, как и ожидалось.

У меня большой опыт работы с 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";. Что это значит?


person SandPiper    schedule 07.10.2018    source источник
comment
Включите отчеты об ошибках. Вы проверяете ошибки в запросах, кроме последнего. Добавьте к этому mysqli_error($mysqli) и посмотрите, есть ли ошибки.   -  person Funk Forty Niner    schedule 07.10.2018
comment
Я добавил его, и он дал мне эту ошибку: 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";. Что это мне говорит?   -  person SandPiper    schedule 07.10.2018
comment
Вы забыли скобку в последнем запросе. Изменить: попробуйте CREATE VIEW DECK_VIEW AS ( SELECT.   -  person Funk Forty Niner    schedule 07.10.2018
comment
Кстати, строка 16 не то, что вы думаете, она есть в запросе из-за отсутствующей скобки, а не $database = "FLASHCARD";. Количество строк исходит из PHP/Query.   -  person Funk Forty Niner    schedule 07.10.2018
comment
@FunkFortyNiner сделал это, спасибо! Думаю, мне просто нужно было еще раз взглянуть на это. Спасибо за объяснение строки 16 тоже.   -  person SandPiper    schedule 07.10.2018
comment
Добро пожаловать.   -  person Funk Forty Niner    schedule 07.10.2018


Ответы (1)


Строка 16 не исходит из того, что вы думаете, она содержится в самом запросе.

Вы пропустили скобку в последнем запросе и должны были использовать mysqli_error($mysqli) в запросе и там.

Поэтому измените свой код там на

CREATE VIEW DECK_VIEW AS ( SELECT...
                         ^ // right there
person Funk Forty Niner    schedule 07.10.2018
comment
Ура! @SandPiper Да, иногда помогает еще одна пара глаз, рад, что смог помочь. Редактировать: Ах, вы удалили комментарий, не беспокойтесь :-) - person Funk Forty Niner; 07.10.2018
comment
Или, наоборот, скобки вокруг SELECT ... не нужны. - person Rick James; 14.11.2018