سلام
در متد construct بعضی از دستورات اجرا نمیشن انگار اصلا نوشته نشدن و باعث خطا میشن، مثل این دستور:
$this->model = new Model();
و این دستور:
$this->connect();
برای همین در چند متد مجبور به نوشتن چندباره این دستورات میشم.
برای کانکت به دیتابیس از msyqli استفاده کردم.
میدونید دلیل این مشکل چی هست؟
متشکرم.
کد کاملتون رو بگذارین تا بشه بررسی کرد مشکل از کجاست. منظورم کد کلاستونه.
کلاس Model که در متد construct دستور زیر اجرا نمیشه:
$this->connect();
class Model {
protected $con;
public function __construct() {
$this->connect();
}
private function connect() {
if ( ! $this->con ) {
$config = Loader::load( 'Configs' );
$this->con = new mysqli( $config->dbHost, $config->dbUser, $config->dbPassword, $config->dbName );
$this->con->query( "SET NAMES 'utf8'" );
$this->con->set_charset( 'utf8' );
}
}
public function query( $query ) {
$this->connect();
return $this->con->query( $query );
}
public function escape( $param ) {
$this->connect();
if ( $param == null )
return 'NULL';
return $this->con->real_escape_string( $param );
}
public function insertId() {
$this->connect();
return $this->con->insert_id();
}
public function arrayQuery( $query ) {
$this->connect();
$result = [];
$values = $this->query( $query );
if ( $values && $values->num_rows > 0 ) {
while ($value = $values->fetch_assoc()) {
$result[] = $value;
}
}
return $result;
}
}
کلاس ActiveRecord در پست بعد
و کلاس ActiveRecord که در construct آن دستور زیر کار نمیکند:
$this->model = new Model();
class ActiveRecord extends Model {
protected $model;
protected $tableName;
protected $fields;
protected $isNew;
public function __construct() {
$this->model = new Model();
foreach ( $this->fields as $key => $value ) {
$this->fields[ $key ] = null;
}
$this->isNew = true;
}
//...
public function findByPk( $id ) {
$className = get_class( $this );
$obj = new $className();
$this->model = new Model();
$id = $this->model->escape( $id );
$sql = "SELECT * FROM `{$this->tableName}` WHERE (`id`='{$id}')";
$data = $this->model->arrayQuery( $sql );
if ( count( $data ) > 0 ) {
foreach ( $data[ 0 ] as $fieldName => $value ) {
$obj->$fieldName = $value;
}
$obj->isNew = false;
return $obj;
}
}
//...
public function update() {
$this->model = new Model();
$fields = array_map( [ $this->model, 'escape' ], $this->fields );
$sql = "UPDATE `{$this->tableName}` SET ";
foreach ( $fields as $key => $value ) {
if ( $key === 'id' ) {
continue;
}
$sql .= "`{$key}`='{$value}',";
}
$sql = substr( $sql, 0, -1 ) . " WHERE (`id`={$fields[ 'id' ]})";
$this->new = false;
}
//...
شما مطمئن هستین کار نمیکنه؟ داخل سازندهها echo بگذارین ببینین چاپ میشه یا نه. شاید مشکل از جای دیگه باشه. بیزحمت کد فراخوانی خودتون رو هم بگذارین (جایی که از این کلاسها شئ ساخته میشه).
متد actionView که فراخوانیها رو انجام میده:
class PostsController extends Controller {
public function actionView($params) {
$post = (new Posts())->findByPk($params['id']);
$post->view++;
$post->save();
$this->render( 'view', compact( 'post' ) );
}
}
و کلاس Model که وقتی فراخوانی متد connect رو کامنت میگیریم ارور میده:
class Model {
protected $con;
public function __construct() {
$this->connect();
}
private function connect() {
$config = Loader::load( 'Configs' );
$this->con = new mysqli( $config->dbHost, $config->dbUser, $config->dbPassword, $config->dbName );
if ( ! $this->con->error ) {
$this->con->query( "SET NAMES 'utf8'" );
$this->con->set_charset( 'utf8' );
echo 'Ok';
}
}
public function query( $query ) {
// $this->connect();
return $this->con->query( $query );
}
public function escape( $param ) {
// $this->connect();
if ( $param == null )
return 'NULL';
return $this->con->real_escape_string( $param );
}
public function insertId() {
// $this->connect();
return $this->con->insert_id();
}
public function arrayQuery( $query ) {
// $this->connect();
$result = [];
$values = $this->query( $query );
if ( $values && $values->num_rows > 0 ) {
while ($value = $values->fetch_assoc()) {
$result[] = $value;
}
}
return $result;
}
}
البته کدهای کانکت رو داخل construct نوشتم بازم خطا داد.
تصویر خطا:
اشیائی که از این کلاس ساخته میشه در همون findByPk و update هست(متدهای ActiveRecord که برای اکشن ویو لازم هستن).
اتفاقی که میفته اینه از کدهای کانکت به دیتابیس که در construct نوشته میشن یا از اونجا فراخوانی میشن، چشم پوشی میشه.
$config = Loader::load('Configs');
$this->con = new mysqli($config->dbHost, $config->dbUser, $config->dbPassword, $config->dbName);
if (!$this->con->connect_error) {
$this->con->query("SET NAMES 'utf8'");
$this->con->set_charset('utf8');
echo 'Ok';
} else {
echo $this->con->connect_error;
}
}
else رو به همون شکل که نوشتین به کدها اضافه کردم فقط همون پیغام خطای قبلی چاپ میشه نه چیز دیگه ای.
میگم مشکل از تنظیمات php.ini نباشه؟
این مدل رو امتحان کنید:
$this->con = new mysqli(...) or die('ERROR: ' . $this->con->connect_error);
البته شدیداً توصیه میکنم که از PDO استفاده کنید. دیگه این روزها افزونهی MySQLi یه مقدار قدیمی بهحساب میاد و کارآیی لازم رو نداره.
(07-06-1399، 03:52 ب.ظ)ADMIN نوشته: [ -> ]این مدل رو امتحان کنید:
$this->con = new mysqli(...) or die('ERROR: ' . $this->con->connect_error);
فقط همون ارور قبلی بدون هیچ پیام دیگه ای.
از همون روش فراخوانی از سایر متدها استفاده میکنم که کار میکرد.
خیلی ممنون که وقت گذاشتین.
درصورت تمایل بهم پیام بدین که توی پیام خصوصی شماره تماس بگذارم توی واتساپ هروقت براتون مقدور بود AnyDesk بدین وصل بشم به سیستمتون ببینم مشکل از کجاست.