Я использую приведенный ниже код для получения данных из моей базы данных, которые соответствуют введенному пользователем году и месяцу.
соединение:
class ConnectDB{
private $servername;
private $username;
private $password;
private $dbname;
protected function connect(){
$this->servername ="localhost";
$this->username ="root";
$this->password ="";
$this->dbname ="dbexpense";
$conn = new mysqli($this->servername,$this->username,$this->password,$this->dbname);
if($conn -> connect_error) {
die("connection failed:".$conn-> connect_error);
}
return $conn;
}
}
Класс для получения данных:
<?php
class SelectAMonthGet extends ConnectDB {
var $year;
var $month;
function __construct( ){
$this->year = $_POST['year'];
$this->month = $_POST['analyze_options_month'];
}
protected function SelectAMonthGetData(){
$year = $this->year;
$month = $this->month;
$sql = $this->connect()->prepare("SELECT * FROM wp_myexpenses WHERE YEAR(date) = ? AND MONTH(date) = ? order by date,id");
$sql->bind_param("ss",$year,$month);
$result = $sql ->execute();
$numRows = $result->num_rows;
if($numRows > 0) {
while ($row = $result->fetch_assoc()){
$data[] = $row;
}
return $data;
}
}
}
?>
Но это не показывает никакого результата, даже если в БД есть данные.
Я могу получить результат, когда использую код без подготовленного утверждения, как показано ниже:
Код без подготовленного заявления (рабочий):
class SelectAMonthGet extends ConnectDB {
var $year;
var $month;
function __construct( ){
$this->year = $_POST['year'];
$this->month = $_POST['analyze_options_month'];
}
protected function SelectAMonthGetData(){
$year = $this->year;; $month = $this->month;
$sql = "SELECT * FROM wp_myexpenses WHERE YEAR(date) = '$year' AND MONTH(date) = '$month' order by date,id";
$result = $this->connect()->query($sql);
$numRows = $result->num_rows;
if($numRows > 0) {
while ($row = $result->fetch_assoc()){
$data[] = $row;
}
return $data;
}
}
}
?>
Я бы хотел использовать подготовленный оператор, чтобы избежать SQL-инъекций. Я не могу понять, что не так с моим кодом? Может кто-нибудь направить меня сюда, пожалуйста?
Обновление:
Как было предложено ADyson в комментариях, включена отчетность об ошибках. Это дает ниже ошибку:
Notice: Trying to get property of non-object in **** on line 34
Строка 34:
$numRows = $result->num_rows;
Обновление:
Изменен код для включения get_result (), как показано ниже
protected function SelectAMonthGetData(){
$year = $this->year;
$month = $this->month;
$sql = $this->connect()->prepare("SELECT * FROM wp_myexpenses WHERE YEAR(date) = ? AND MONTH(date) = ? order by date,id");
$sql->bind_param("ss",$year,$month);
$sql ->execute();
$result = $sql->get_result();
$numRows = $result->num_rows;
if($numRows > 0) {
while ($row = $result->fetch_assoc()){
$data[] = $row;
}
return $data;
}
}
Но теперь его ошибка выдачи:
Fatal error: Uncaught Error: Call to undefined method mysqli_stmt::get_result() in ****:28
При проверке некоторых решений ошибка возникает из-за того, что драйвер mysqlnd не включен. Это верно в моем случае.
Будет ли какое-нибудь альтернативное решение, чтобы получить его?