Соединение установлено с сервером MariaDB, но вы не можете получить данные в базу данных?

0

Это весь PHP-код:

<html>
<head>
   <title>Connect to MariaDB Server</title>
</head>

<body>
  <?php
     $dbhost = 'localhost';
     $dbuser = 'test';
     $dbpass = 'pass';
     $dbname = 'databseName';
     $conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);

     if(! $conn ) {
        die("Connection failed: " . mysqli_connect_error());
     }

     echo "Connected successfully<br><br>";

     function add($url, $category){
         $sql = "INSERT INTO tt (url, category) VALUES ('$url', '$category');";
         if(mysqli_query($conn, $sql)){
             echo "Recorded.";
         } else {
             echo "Error: " . $sql . "<br>" . mysqli_error($conn);
             }
      }

      if(function_exists($_GET['f'])){
         $_GET['f']($_GET['url'], $_GET['cat']);
      }

      mysqli_close($conn);
   ?>
</body>
</html>

Когда я набрал " http://localhost/connect.php? F = add & url = www.google.com & cat = google " в своем браузере, это результат:

Connected successfully

Error: INSERT INTO tt (url, category) VALUES ('www.google.com', 'google');
Notice: Undefined variable: conn in /var/www/html/connect.php on line 24

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in /var/www/html/connect.php on line 24

Fatal error: Uncaught Error: Call to undefined function mysqli_errot() in /var/www/html/connect.php:27 Stack trace: #0 /var/www/html/connect.php(32): add('www.google.com', 'google') #1 {main} thrown in /var/www/html/connect.php on line 27

Я пробовал много других возможных решений, которые я нашел в Интернете, но никто из них не работает. Пожалуйста, помогите, большое спасибо заранее!

  • 0
    пожалуйста, узнайте об инъекциях sql и о том, как этого избежать, с подготовленными утверждениями (подготовленные заявления - хорошая привычка!)
  • 0
    Для записи, ваше использование f чрезвычайно опасно. Что происходит, когда кто-то передает f=unlink ?
Показать ещё 15 комментариев
Теги:
mariadb

1 ответ

1
Лучший ответ

В вашей функции:

function add($url, $category) {
    // code
}

Вы пытаетесь использовать переменную $conn. Это определено вне функции.

Вы должны передать эту переменную в функцию:

function add($url, $category, &$conn) {
    // code
}

if(function_exists($_GET['f'])){
    $_GET['f']($_GET['url'], $_GET['cat'], $conn);
}

Вы могли бы просто использовать global $conn; внутри функции, но предлагается избегать использования global целиком. Это приводит к беспорядочным и опасным условиям кода в крупных проектах. Меньше контроля. Передавая ссылку $ conn по ссылке, вы специально обеспечиваете правильное значение, которое будет использоваться.

В качестве побочного примечания: подготовленные заявления были бы хороши для использования для вашего SQL, поскольку вы переносите переданные значения, которые могут иметь вредоносный SQL внутри них.

В качестве примечания на стороне: этот процесс, который вы делаете, выглядит немного неустойчивым, и нужно много внимания уделять именам функций белого списка и настройке. Возможно, вы захотите переместить все это в класс.

  • 1
    OMG спасибо большое! Я наконец смогу вставить данные в свою базу данных! Да, я буду использовать подготовленные заявления в следующий раз! Спасибо!
  • 0
    Время от времени я также игнорировал глобальную переменную ... это происходит! :) Многие исправляются при перемещении объектов в класс, поскольку $conn был бы настроен как $this->conn или self::$conn .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню