2015-12-16 3 views
0

У меня есть эта функция для вставки данных изображения в базу данных mysql, а также значение сеанса было объявлено во время входа в систему, которое не будет уничтожено до выхода из системы. Но, браузер показывает ошибку, Неопределенная переменная: _SESSION. Почему? Пожалуйста, кто-нибудь поможет?Ошибка при вставке данных сеанса в базу данных mysql

public function save($filename, $type, $size){ 

    global $connect; 


     $sql = "INSERT INTO photograph ("; 
     $sql .= " filename, type, size, caption "; 
     $sql .= ") VALUES ("; 
     $sql .= " '{$filename}', '{$type}', '{$size}', '{$_SESSION["username"]}' "; 
     $sql .= ")"; 
     $result = mysqli_query($connect, $sql); 

     if(!$result){ 

      echo "Querying failed"; 
     } 

} 
+0

Это потому, что ваши цитаты повсюду, и вы используете по крайней мере один [Ключевое слово MySQL] (https://dev.mysql.com/doc/refman/5.5/en/keywords.html) в качестве имени столбца. Вы должны проверить все ваши запросы и никогда не предполагать, что запрос будет работать. –

+0

У вас есть 'session_start()' в начале скрипта? – Barmar

ответ

0

Во-первых, вам не нужно делать все .= конкатенации, которая затем упрощает чтение запроса.

Во-вторых, вы не можете использовать двойные кавычки внутри строки с двойными кавычками, поскольку это завершает строку с двойными кавычками, поэтому используйте $_SESSION['username'] с одинарными кавычками.

В-третьих, я думаю, что хотя бы одно из имен ваших столбцов является зарезервированным словом MYSQL, поэтому, если есть сомнения, оберните имена столбцов в обратные ссылки.

Также неплохо было вывести реальную ошибку базы данных в сообщение об ошибке, по крайней мере, пока вы находитесь в разработке.

public function save($filename, $type, $size){ 

    global $connect; 


     $sql = "INSERT INTO photograph (
         `filename`, `type`, `size`, `caption`) 
       VALUES ('{$filename}', '{$type}', '{$size}',  
         '{$_SESSION['username']}')"; 

     $result = mysqli_query($connect, $sql); 

     if(!$result){ 
     echo "Querying failed". mysqli_error($connect); 
     } 

} 

И, наконец, делает запрос таким образом открывает вам до проблем SQL инъекций, поэтому постарайтесь использовать подготовленные заявления, как этот

public function save($filename, $type, $size){ 

    global $connect; 


    $sql = "INSERT INTO photograph (
         `filename`, `type`, `size`, `caption`) 
       VALUES (?,?,?,?)"; 

    $stmt = mysqli_prepare($sql); 

    mysqli_stmt_bind_param($stmt, "ssis", 
          $filename, $type, 
          $size, $_SESSION["username"]); 
    $result = mysqli_stmt_execute($connect, $stmt); 

    if(!$result){ 
     echo "Querying failed". mysqli_error($connect); 
    } 
} 

Наконец, это плохая практика, чтобы использовать global в классе как это разрушает инкапсуляцию. Вместо того, чтобы передать $connect в этом случае в качестве параметра этого метода или еще лучше, если этот класс это нужно сделать это переменная класса

class whatever 
{ 

    public $connect 

    public function __construct($db_connection) 
    { 
     $this->connect = $db_connection; 
    } 

    public function save($filename, $type, $size){ 

     $sql = "INSERT INTO photograph (
          `filename`, `type`, `size`, `caption`) 
        VALUES (?,?,?,?)"; 

     $stmt = mysqli_prepare($this->connect,$sql); 

     mysqli_stmt_bind_param($stmt, "ssis", 
           $filename, $type, 
           $size, $_SESSION["username"]); 
     $result = mysqli_stmt_execute($stmt); 

     if(!$result){ 
      echo "Querying failed " . mysqli_error($this->connect); 
     } 
    } 
} 
0

попробовать обновить эту строку, чтобы быть:

$sql .= " '{$filename}', '{$type}', '{$size}', '".$_SESSION["username"]."' "; 

двойные котировки на $ _SESSION массива вызвать проблемы внутри строковых двойных цитат

Смежные вопросы