2015-05-12 2 views
0

Первая ссылка идет на вопрос, я спросил по поводу вопрос, связанный с использованием синтаксиса Heredoc I am unable to fix an issue concerning an HEREDOC syntax errorИзвлечение данных из SQL с помощью PHP

Вторая ссылка идет на вопрос очень похож на ссылку выше Issue with heredoc and 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

Пожалуйста, [прекратите использование 'mysql_ *' функций] (http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php). Они больше не поддерживаются и [официально устарели] (https://wiki.php.net/rfc/mysql_deprecation). Узнайте о [подготовленных заявлениях] (http://en.wikipedia.org/wiki/Prepared_statement) и подумайте об использовании PDO, [это не так сложно, как вы думаете] (http://jayblanchard.net/demystifying_php_pdo.html) , * Что такое строка 7? * –

+0

Я знаю, что функции mysql_ + устарели, но я следую примерам из книги, так или иначе строка «7» - это строка, в которой ошибка возникает в фрагменте кода – Riccardo

+2

Это НИЧЕГО не имеет отношения к Heredoc. Это ошибка запроса mysql, которую вы получаете от запуска недопустимого запроса. Это результат части 'или die (mysql_error ($ db))'. Я бы предположил, что это третий запрос, потому что это единственный, который имеет длину 7 строк. Вероятно, вы не передаете '$ _GET ['movie_id']' в URL-адресе. –

ответ

1

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

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

//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 - это имя функции, а не переменная. Удалите из него $.

Кроме того, вероятно, вы должны проверить, есть ли результат из вашего первого запроса, есть ли строки с mysql_num_rows. Вполне возможно, что кто-то передает идентификатор фильма, которого нет.

+0

где именно в верхней части моего кода? могу ли я написать его где-нибудь? – Riccardo

+0

эй он возвращает фильм id не найден, на самом деле кажется, что movie_id не существует нигде – Riccardo

+0

Если он вернул «идентификатор фильма не найден», значит, вы не передаете идентификатор фильма в URL-адресе. Вам нужно загрузить страницу, например: 'page.php? Movie_id = 1234', где' 1234' является идентификатором фильма из вашей базы данных. Обычно эта страница связана с другой страницы, в которой перечислены все фильмы. –