رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل با بعضی دستورات در متد construct
#1
سلام
در متد construct بعضی از دستورات اجرا نمیشن انگار اصلا نوشته نشدن و باعث خطا میشن، مثل این دستور:
$this->model = new Model();
و این دستور:
$this->connect();
برای همین در چند متد مجبور به نوشتن چندباره این دستورات میشم.
برای کانکت به دیتابیس از msyqli استفاده کردم.
میدونید دلیل این مشکل چی هست؟
متشکرم.
پاسخ
تشکر شده توسط:
#2
کد کاملتون رو بگذارین تا بشه بررسی کرد مشکل از کجاست. منظورم کد کلاستونه.
پاسخ
تشکر شده توسط: abdollah110110
#3
کلاس 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 در پست بعد
پاسخ
تشکر شده توسط:
#4
و کلاس 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;
}
//... 
پاسخ
تشکر شده توسط:
#5
شما مطمئن هستین کار نمیکنه؟ داخل سازنده‌ها echo بگذارین ببینین چاپ میشه یا نه. شاید مشکل از جای دیگه باشه. بیزحمت کد فراخوانی خودتون رو هم بگذارین (جایی که از این کلاس‌ها شئ ساخته میشه).
پاسخ
تشکر شده توسط: abdollah110110
#6
متد 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 نوشتم بازم خطا داد.
تصویر خطا:
[عکس: e03o_error-connect.jpg]
اشیائی که از این کلاس ساخته میشه در همون findByPk و update هست(متدهای ActiveRecord که برای اکشن ویو لازم هستن).

اتفاقی که میفته اینه از کدهای کانکت به دیتابیس که در construct نوشته میشن یا از اونجا فراخوانی میشن، چشم پوشی میشه.
پاسخ
تشکر شده توسط:
#7
$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;
    }
}
پاسخ
تشکر شده توسط:
#8
else رو به همون شکل که نوشتین به کدها اضافه کردم فقط همون پیغام خطای قبلی چاپ میشه نه چیز دیگه ای.

میگم مشکل از تنظیمات php.ini نباشه؟
پاسخ
تشکر شده توسط:
#9
این مدل رو امتحان کنید:
$this->con = new mysqli(...) or die('ERROR: ' . $this->con->connect_error);
پاسخ
تشکر شده توسط: abdollah110110
#10
البته شدیداً توصیه میکنم که از PDO استفاده کنید. دیگه این روزها افزونه‌ی MySQLi یه مقدار قدیمی به‌حساب میاد و کارآیی لازم رو نداره.
پاسخ
تشکر شده توسط: abdollah110110
#11
(07-06-1399، 03:52 ب.ظ)ADMIN نوشته: این مدل رو امتحان کنید:
$this->con = new mysqli(...) or die('ERROR: ' . $this->con->connect_error);

فقط همون ارور قبلی بدون هیچ پیام دیگه ای.
از همون روش فراخوانی از سایر متدها استفاده میکنم که کار میکرد.
خیلی ممنون که وقت گذاشتین.
پاسخ
تشکر شده توسط:
#12
درصورت تمایل بهم پیام بدین که توی پیام خصوصی شماره تماس بگذارم توی واتس‌اپ هروقت براتون مقدور بود AnyDesk بدین وصل بشم به سیستمتون ببینم مشکل از کجاست.
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 4 مهمان