Получить данные из SQL с помощью PHP

Первая ссылка ведет на вопрос, который я задал относительно проблемы, связанной с использованием синтаксиса Heredoc. Я не могу исправить проблему, связанную с ошибкой синтаксиса HEREDOC.

Вторая ссылка идет на вопрос, очень похожий на ссылку выше. Проблема с heredoc и PHP.

Я столкнулся с проблемой получения данных из базы данных на странице php. Проблема не связана с Heredoc, Heredoc находится в коде, но проблема вызвана ошибкой синтаксиса sql.

<?php
     // riceve l'identifictivo di un regista e ne restituisce il nome completo
    function get_director($director_id) {

        global $db;

        $query = 'SELECT
                people_fullname
            FROM
                people
            WHERE
                people_id = ' . $director_id;
        $result = mysql_query($query, $db) or die(mysql_error($db));

        $row = mysql_fetch_assoc($result);
        extract($row);

        return $people_fullname;
    }

    // riceve l'identificativo di un attore principale e ne restituisce il nome 
    // completo
    function get_leadactor($leadactor_id) {

        global $db;

        $query = 'SELECT
                people_fullname
            FROM
                people
            WHERE
               people_id = ' . $leadactor_id;
        $result = mysql_query($query, $db) or die(mysql_error($db));

        $row = mysql_fetch_assoc($result);
        extract($row);

        return $people_fullname;                 
    }

    // riceve l'identificativo di un tipo di film e ne restituisce la 
    //descrizione
    function get_movie($type_id) {

        global $db;

        $query = 'SELECT
                movietype_label
            FROM
                movietype
            WHERE
                movietype_id = ' . $type_id;
        $result = mysql_query($query, $db) or die(mysql_error($db));

        $row = mysql_fetch_assoc($result);
        extract($row);

        return $movietype_label;
    }

    // funziona per calcolare se un film ha generato un profitto, una perdita o è
    // in pareggio
    function calculate_differences($takings, $cost) {

        $difference = $takings - $cost;

        if ($difference < 0) {
            $color = 'red';
            $difference = '$' . abs($difference) . ' million';
        } elseif ($difference > 0) {
            $color ='green';
            $difference = '$' . $difference . ' million';
        } else {
            $color = 'blue';
            $difference = 'broke even';
        }

        return '<span style="color:' . $color . ';">' . $difference . '</span>';        
    }

    // collegamento a MYSQL
    $db = mysql_connect('localhost', 'pippo', 'pluto') or 
        die ('Unable to connect. Check your connection parameters. ');
    mysql_select_db('moviesite', $db) or die(mysql_error($db));

    // recupera le informazioni
    $query = 'SELECT
            movie_name, movie_year, movie_director, movie_leadactor,
            movie_type, movie_running_time, movie_cost, movie_takings
        FROM
            movie
        WHERE
            movie_id = ' . $_GET['movie_id'];
    $result = mysql_query($query, $db) or die(mysql_error($db));

    $row = mysql_fetch_assoc($result);
    $movie_name        = $row['movie_name'];
    $movie_director    = get_director($row['movie_director']);
    $movie_leadactor   = get_leadactor($row['movie_leadactor']);
    $movie_year        = $row['movie_year'];
    $movie_running_time = $row['movie_running_time'] .' mins';
    $movie_takings     = $row['movie_takings'] . ' million';
    $movie_cost        = $row['movie_cost'] . ' million';
    $movie_health      = $calculate_differences($row['movie_takings'],
                              $row['movie_cost']);

    // mostra le informazioni
    echo <<<ENDHTML
    <html>
        <head>
             <title>Details and Reviews for: $movie_name</title>
        </head>
        <body>
        <div style="text-align: center;">
        <h2>$movie_name</h2>
        <h3><em>Details</em></h3>
        <table cellpadding="2" cellspacing="2"
         style="width: 70%; margin-left: auto; margin-right: auto;">
        <tr>
         <td><strong>Title</strong></strong></td>
         <td>$movie_name</td>
         <td><strong>Release Year</strong></strong></td>
         <td>$movie_year</td>
         </tr><tr>
         <td><strong>Movie Director</strong></td>
         <td>$movie_director</td>
         <td><strong>Cost</strong></td>
         <td>$$movie_cost<td/>
         </tr><tr>
         <td><strong>Lead Actor</strong></td>
         <td>$movie_leadactor</td>
         <td><strong>Takings</strong></td>
         <td>$$movie_takings<td/>
         </tr><tr>
         <td><strong>Running Time</strong></td>
         <td>$movie_running_time</td>
         <td><strong>Health</strong></td>
         <td>$movie_health<td/>
        </tr>
      </table></div>
      </body>
    </html>
ENDHTML;
?>

и это синтаксическая ошибка, с которой я имею дело:

У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать около '' в строке 7

1 ответ

Решение

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

В верхней части вашего кода вы должны проверить, если $_GET['movie_id'] Исеть Также было бы разумно поставить простую проверку is_numeric, которая будет препятствовать тому, чтобы значение в url было чем-то отличным от числа. Если переданный идентификатор не является числом (как идентификатор должен быть), то это так же хорошо, как и не переданный. Я бы, вероятно, использовал что-то более сжатое, например, троичное выражение, но это более читабельно и понятно для кого-то нового. Поместите что-то вроде этого в верхней части вашего скрипта, прежде чем создавать и выполнять этот первый запрос (может быть до или после объявления функций):

//if the movie id was passed in the url and is a number
if(isset($_GET['movie_id']) && is_numeric($_GET['movie_id'])){
    //get it
    $movie_id = $_GET['movie_id'];
} else {
    //stop the code and display error.
    die("Movie id not found.");
}

Затем внизу в запросе замените $_GET['movie_id'] с переменной $movie_id,

Еще одна проблема, которую я видел, у вас есть, и вы столкнетесь, $calculate_differences это имя функции, а не переменная. Удалить $ из до этого.

Кроме того, вам, вероятно, следует проверить, есть ли в результате вашего первого запроса какие-либо строки с http://www.php.net/mysql_num_rows. Вполне возможно, что кто-то передает идентификатор фильма, который не существует.

Другие вопросы по тегам