Проблема с простой инструкцией SQL / функция PHP не работает

#php #mysql

#php #mysql

Вопрос:

У меня есть простая функция для записи в мою базу данных. Это ошибка, которую я получаю.

Это ошибка, которую я получаю

Примечание: попытка получить свойство не-объекта в /var/sites/q/quasisquest.uk/public_html/KeepScore/MySQLDao.php в строке 92 Фатальная ошибка: Неперехваченное исключение ‘Exception’ в /var/sites/q/quasisquest.uk/public_html/KeepScore/MySQLDao.php:92 Трассировка стека: #0 /var/sites/q/quasisquest.uk/public_html/KeepScore/createCommunity.php (26): MySQLDao->Создать сообщество(‘radowns82 @gmail …’, ‘YGHFYG’, ‘Endcliffe’) #1 {main} добавлено /var/sites/q/quasisquest.uk/public_html/KeepScore/MySQLDao.php в строке 92

Это начальный PHP-скрипт, который его вызывает:

 <?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


require("Conn.php");
require("MySQLDao.php");

$email = htmlentities($_POST["email"]);
$code = htmlentities($_POST["code"]);
$communityname = htmlentities($_POST["communityname"]);

$dao = new MySQLDao();
$dao -> openConnection();

$result = $dao -> createCommunity($email, $code, $communityname);

$dao->closeConnection();

?>
  

Это MySQLDao.php

 <?php

class MySQLDao{

var $dbhost = null;
var $dbuser = null;
var $dbpass = null;
var $conn = null;
var $dbname = null;
var $result = null;

public function __construct(){
    $this->dbhost = Conn::$dbhost;
    $this->dbuser = Conn::$dbuser;
    $this->dbpass = Conn::$dbpass;
    $this->dbname = Conn::$dbname;
}

public function openConnection()
{
    $this->conn = new mysqli($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname);
    if (mysqli_connect_errno())
        echo new Exception("Could not establish connection with database");

}

public function getConnection()
{
echo ("2");
    return $this->conn;
}

public function closeConnection()
    {
    if($this->conn!=null)
        $this->conn->close();
}

public function getUserDetails($email)
{
    $returnValue = array();
    $sql = "select * from users where user_email='".$email."'";

    $result = $this->conn->query($sql);
    if($result != null amp;amp; (mysqli_num_rows($result) >= 1)){
        $row = $result -> fetch_array(MYSQLI_ASSOC);
        if(!empty($row)){
            $returnValue = $row;
        }
    }
    return $returnValue;

}

public function getUserDetailsWithPassword($email, $userPassword)
{
    $returnValue = array();
    $sql = "select id, user_email, user_name from users where user_email = '".$email."' and user_password = '".$userPassword."'";

    $result = $this->conn->query($sql);
    if($result != null amp;amp; (mysqli_num_rows($result) >= 1 )){
        $row = $result -> fetch_array(MYSQLI_ASSOC);
        if(!empty($row)){
            $returnValue = $row;
        }
    }
    return $returnValue;
}

public function registerUser($email, $password, $username)
{
    $sql = "insert into users set user_email=?,user_password=?,user_name=?";
    $statement = $this->conn->prepare($sql);

    if(!$statement)
        throw new Exception($statement->error);

    $statement->bind_param("sss", $email, $password, $username);
    $returnValue = $statement->execute();

    return $returnValue;
}

public function createCommunity($email, $code, $communityname)
{
    $sql = "insert into communities set email=?,code=?,communityname=?";
    $statement = $this->conn->prepare($sql);

if(!$statement){
        throw new Exception($statement->error);
}
    $statement->bind_param("sss", $email, $code, $communityname);
    $returnValue = $statement->execute();

    return $returnValue;
}


}

?>
  

В этой таблице «сообщества» также есть столбец «id» (1-й столбец), который я не публикую, поскольку я думал, что он будет автоматически заполняться и увеличиваться… может быть, это то, где я ошибаюсь?

Комментарии:

1. Возможно, ваш ‘$this-> conn равен нулю. Проверьте это или покажите нам больше кода.

2. Вы проверяете, является ли $statement значение false , поэтому оно не будет объектом. Вместо этого проверьте наличие mysqli_error в вашем соединении.

3. Опубликуйте полный MySQLDao класс

4. соединение $this-> conn определенно работает нормально, поскольку в нем содержатся другие функции MySQLDao.php досье.

5. Использовать throw new Exception($this->conn->error);

Ответ №1:

Если соединение не удается, сначала вам нужно знать, почему so показывает фактическую ошибку базы данных. и, во-вторых, очень мало смысла продолжать выполнение скриптов без подключения к базе данных.

Итак, могу ли я предложить это изменение в вашем openConnection() методе

Кроме того, если вы считаете, что в коде MSYQLI есть вероятность чего-то неправильного, эти 4 строки в основном гарантируют, что вам сообщат о любых ошибках во время разработки, особенно если вы разрабатываете на реальном сервере с отключенными ОТЧЕТАМИ ОБ ОШИБКАХ.

 <?php
ini_set('display_errors', 1); 
ini_set('log_errors',1); 
error_reporting(E_ALL); 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);


public function openConnection()
{
    $this->conn = new mysqli($this->dbhost, $this->dbuser, 
                             $this->dbpass, $this->dbname
                            );
    if ($mysqli->connect_error) {   
        echo 'Connect Error: ' . $mysqli->connect_errno . ' - '
        . $mysqli->connect_error;
        exit;
    }
}