Member 13135459 Ответов: 2

Пожалуйста, дайте мне решение этой ошибки


<?php

class database {

	public $sql = '';
	public $query = '';
	public $con;
	function __construct(){
		self::db();
	}	
	
	static function db()
	{	
		
		if($_SERVER['HTTP_HOST'] == 'localhost'){
	
			$host = 'localhost';
			$username = 'root';
			$pass = '';
			$db = 'alltoitskin';
		
		}else{
			
			$host = 'alltoitskin.db.7649825.hostedresource.com';
			$username = 'alltoitskin';
			$pass = 'Skinlogica123';
			$db ='alltoitskin';
		}
		
		$con=mysqli_connect($host, $username ,$pass)or die("mysql not connected");				
		mysqli_select_db($con,$db) or die('Invalid database selected');


		
	}
	
	function result_array($query){
			
			$this->query = $query;
			self::db();
									
		$result = array();
		$Q=mysqli_query($con,$query);
		
		if($Q && mysqli_num_rows($Q) > 0){
			while($tmp = mysqli_fetch_assoc($Q)){
				$result[] = $tmp;
			}
		}		
		return $result;
		
	}
	
	
	function result_row($query){
			
			$this->query = $query;
			self::db();		
		
		$result = array();
		//$Q=mysql_query($query);
		$Q=mysqli_query($con,$query);
		
		if($Q && mysqli_num_rows($Q) > 0){
			$tmp = mysqli_fetch_assoc($Q);
			return $tmp;			
		}
		
		return $result;
		
	}
	
	
	function insert($data = array(), $table = ''){		
		$t = sizeof($data);		
		if(empty($data) || $table == ''){
			return false;
		}
			
		$this->sql = 'INSERT INTO '.$table.' SET ' ;
		$i = 1;
		foreach($data as $k => $v){
			$this->sql .= $k." = '".$v."' ";
			
			if($i < $t ){
				$this->sql .= ' , ';
			}
			$i++;			
		}
		
		//echo $this->sql;
		
		$Q = mysql_query($this->sql);
				
		if($Q){			
			return mysql_insert_id();
		}
		
		return false;			
	}
	
	
	function num_rows($query){
	
		$this->query = $query;
		self::db();
		
		$result = array();
		$Q=mysql_query($query);
		
		if($Q){
			return mysql_num_rows($Q);
		}
		return 0;
		
	}
	
	function update($query){
		
		$this->query = $query;
		$Q = 	mysql_query($query);
		
		if($Q && mysql_affected_rows() > 0 ){
			return true;
		}
		
		return false;
	}
	
	function last_query(){
		return $this->query;
	}
	

}
?>


Что я уже пробовал:

Notice: Undefined variable: con in C:\xampp\htdocs\grip-engineering\classes\database.php on line 62

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\grip-engineering\classes\database.php on line 62

Nick_3141592654

В следующий раз, когда вы опубликуете такой вопрос, пожалуйста, укажите конкретный номер строки в вашем источнике, где произошла ошибка. Ожидать, что люди будут считать строки, чтобы найти, где находится № 62, - это довольно много!

Во всяком случае, я подсчитал строки, и ответ на ваш вопрос:

mysqli_query () ожидает, что параметр 1 будет mysqli, null задан

Нулевая переменная, о которой идет речь, - это $con. Это означает, что ваше соединение с БД не было установлено.

Я бы посоветовал вам взять отладчик (Netbeans работает хорошо) и установить точку останова в вашей функции db (). Для серверной разработки PHP отладчик является важным инструментом, поэтому я настоятельно рекомендую вам сделать инвестиции, чтобы научиться его использовать, если вы еще не знаете. Даже если вы можете найти простой ответ на этот вопрос, вам нужно уметь эффективно отлаживать его самостоятельно.

Member 13135459

я удалил статическое ключевое слово, но оно дает ту же ошибку

ZurdoDev

Также разместите соответствующий заголовок.

2 Ответов

Рейтинг:
2

Patrice T

Никогда не создавайте SQL-запрос путем конкатенации с пользовательскими вводами, он называется "SQL-инъекция", он опасен для вашей базы данных и подвержен ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользовательский ввод типа "Брайан О'Коннер" может привести к сбою вашего приложения, то это уязвимость SQL-инъекции.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Рейтинг:
2

Jochen Arndt

Вы объявили свою функцию db() как static Статические функции не имеют доступа к переменным-членам или нестатическим функциям-членам. Итак, переменная $con в статической функции используется не переменная-член класса, а локальная переменная, и переменная-член класса остается неинициализированной.

Решение: удалите static ключевое слово.

[РЕДАКТИРОВАТЬ]
Вы также должны объявить переменные в своем db() функция в области уровня функции, а не в условной области, и проверьте, было ли соединение успешным:

$host = 'alltoitskin.db.7649825.hostedresource.com';
$username = 'alltoitskin';
$pass = 'Skinlogica123';
$db ='alltoitskin';
if($_SERVER['HTTP_HOST'] == 'localhost'){
    $host = 'localhost';
    $username = 'root';
    $pass = '';
    $db = 'alltoitskin';
}
[/РЕДАКТИРОВАТЬ]


Member 13135459

я удалил статическое ключевое слово, но оно дает ту же ошибку

Jochen Arndt

Тогда соединение могло бы не сработать ($con-false).
Добавьте чек на это в свой код.
И объявите используемые переменные в db() в области действия функции:

$host = 'alltoitskin.db.7649825.hostedresource.com';
$username = 'alltoitskin';
$pass = 'Skinlogica123';
$db ='alltoitskin';
if($_SERVER['HTTP_HOST'] == 'localhost'){
/* set for localhost here */
}