Это весь 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
Я пробовал много других возможных решений, которые я нашел в Интернете, но никто из них не работает. Пожалуйста, помогите, большое спасибо заранее!
В вашей функции:
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 внутри них.
В качестве примечания на стороне: этот процесс, который вы делаете, выглядит немного неустойчивым, и нужно много внимания уделять именам функций белого списка и настройке. Возможно, вы захотите переместить все это в класс.
$conn
был бы настроен как $this->conn
или self::$conn
.
f
чрезвычайно опасно. Что происходит, когда кто-то передаетf=unlink
?