Синтаксический анализ незакрытых ‘}` тегов

#php

#php

Вопрос:

введите описание изображения здесь

Я хочу использовать html-код между foreach ними, но я получаю эту ошибку о том, что тег не закрывается ( } )

Сообщение об ошибке: ( ! ) Ошибка синтаксического анализа: незакрытый ‘{‘ в строке 26 в D:xampphtdocsphpphp_lernenmyphpdatabasepdo.php в строке 52

может быть, кто-нибудь знает об этом сообщении об ошибке? Вот код:

 <!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<table>
    <tr>
        <th>id</th>
        <th>user name</th>
        <th>name</th>
        <th>email</th>
    </tr>
    <?php
    $servername = 'localhost';
    $dbname = 'test';
    $username = 'root';
    $password = '';
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM user";
        $results = $conn->query($sql);
        foreach ($results as $results) {
            ?>
            <tr>
                <td><?php echo $results['id'] ?></td>
                <td><?php echo $results['username'] ?></td>
                <td><?php echo $results['name'] ?></td>
                <td><?php echo $results['mail'] ?></td>
            </tr>
            <?
        }
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
    $conn = null;
    ?>
</table>
</body>
</html>
 

Комментарии:

1. Попробуйте использовать <?php для открывающего тега вместо <?

2. Я сделал это, но это та же ошибка ( ! ) Ошибка синтаксического анализа: незакрытый ‘{‘ в строке 28 в D:xampphtdocsphpphp_lernenmyphpdatabasepdo.php в строке 43

3. Не удалось воспроизвести после замены <? на <?php в строке 36 (в конце foreach): ideone.com/cEJsfC

Ответ №1:

В строке 36 отсутствует тег php. Попробуйте это:

 try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT * FROM user";
    $results = $conn->query($sql);
    foreach ($results as $results) {
        ?>
        <tr>
            <td><?php echo $results['id'] ?></td>
            <td><?php echo $results['username'] ?></td>
            <td><?php echo $results['name'] ?></td>
            <td><?php echo $results['mail'] ?></td>
        </tr>
        <?php // <------ Missing php tag here
    }
} catch (PDOException $e) {
    echo $e->getMessage();
}
 

Ответ №2:

Вам нужно ‘;’ сразу после того, как вы вернетесь в свой php-код, <? перед закрывающей скобкой } .

Когда вы выходите из своего php, чтобы вставить некоторый html-код в этом конкретном случае или итерации цикла, он по-прежнему является «строкой» кода для вашего PHP, и его необходимо соответствующим образом завершить, таким образом, ‘;’. Вот эта часть кода исправлена:

     try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM user";
        $results = $conn->query($sql);
        foreach ($results as $results) {
            ?>
            <tr>
                <td><?php echo $results['id'] ?></td>
                <td><?php echo $results['username'] ?></td>
                <td><?php echo $results['name'] ?></td>
                <td><?php echo $results['mail'] ?></td>
            </tr>
            <?; # <---- this ; here
        }
 

Вы также хотите придерживаться <?php в этих случаях, поскольку я обнаружил в своем личном php, что отсутствие всего открывающего тега привело к тому, что мой скрипт не узнал о начале и остановке моих разделов php-кода.

Комментарии:

1. Эта точка с запятой абсолютно не нужна. И не только это, это, вероятно, вызовет другую синтаксическую ошибку.

2. По моему опыту, это не так. Без точки с запятой мой веб-сервер не смог преобразовать закрывающую скобку в мой оператор else в открывающую скобку. Если я удалю точку с запятой прямо сейчас и перезагружу свой веб-сервер, страница сломается. И моя страница настроена так, как указано выше, за исключением того, что моя находится в операторе IF-Else вместо foreach . Может зависеть от версии? Я использую PHP 7.4.12 на веб-сервере Apache. Я долго ломал голову, пытаясь решить эту проблему, и точка с запятой сработала для меня.

3. Я не знаю настройки вашего скрипта или с каким кодом вы имеете дело, но здесь это только повредит. Возможно, если бы вы поделились своим кодом, мы могли бы определить, как и почему.