خطا در کوئری زدن به دیتابیس

پرسیده شده
فعالیت 1401 روز پیش
دیده شده 1270 بار
0

سلام و احترام

من در حال توسعه پروژه‌ای هستم که برای تمرین خودم تعریف کردم. الان رسیدم به بخش مدل (Model) که تو این قسمت منو اسیر کرده!

مشکل اینکه، همه چی درسته ولی داده توی دیتابیس نمیشینه، کوئری و .. همه چیو بررسی کردم ولی باز کار نمیکنه. اگه امکانش هست کدهای پایینو بررسی کنید و ببینید مشکل چیه؟

<?php

namespace Bootstrap;

use PDO as PDOAlias;

abstract class Model
{
    protected $dbh;
    protected $stmt;
    protected $table;
    protected $pk = 'id';
    protected $order_by = false;

    public function __construct()
    {
        $this->dbh = new PDOAlias("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . "", DB_USER, DB_PASS);
    }

    public function create($data)
    {
        $result = $this->getKeysAndValues($data, 'create');
        $stmt = $this->dbh->prepare($result['sql']);
        $stmt->execute($result['execute']);
        return $this->dbh->lastInsertId();
    }

    protected function getKeysAndValues($arr, $type = null)
    {
        $result = [];
        $execute = [];
        $sql = '';
        $sets = '';
        $keys = '';
        $i = 0;

        // extraction Keys
        foreach ($arr as $k => $v) {
            $execute += ["$k" => $v];
            if (count($arr) - 1 == $i) {
                $keys .= ":$k";
                $sets .= "$k";
                break;
            }
            $keys .= ":$k, ";
            $sets .= "$k, ";
            $i++;
        }
        $result += ["execute" => $execute];
        if ($type == 'create') {
            $sql = "INSERT INTO {$this->table} ({$sets}) VALUES ($keys)";
            $result += ["sql" => $sql];
            return $result;
        }
    }
}

متد create در اصل کار insert به دیتابیس رو انجام میده 

 

 

فایل پیوست

امیر صالحی
امیر صالحی

28 خرداد 99

3

مورد تایید استاد

حذف شده

کلاستون بجز همون موردی که گفتم تست گرفتم، مشکلی نداره.

شاید توو ورودیها مشکل دارید و یا ... trace کنید و print_r بگیرید ببینید خروجی هر قطعه چی هست!

متد شمارو با استفاده از توابع خود PHP بازنویسی کردم:

protected function getKeysAndValues($arr, $type = null)
{
    if ($type == 'create') {
        $sql = "INSERT INTO {$this->table} (". implode(',', array_keys($arr)) .") VALUES (". implode(',', array_map(function($key) { return ':' . $key; }, array_keys($arr))) .")";

        $result = [
        	'execute' => array_combine(array_map(function($key) { return ':' . $key; }, array_keys($arr)), array_values($arr)),
        	'sql' => $sql
        ];
        echo '<pre>' . print_r($result, true) . '</pre>';

        return $result;
    }
}

 

برای تست کلاسو از حالت abstract در بیارید و خود کلاس Model رو از روش آبجکت بسازید و create رو صدا بزنید.

با توجه به الگوریتم شما، داده ی نمونه:

$obj = new Model;
$obj->create(['firstname' => 'mohsen', 'lastname' => 'movahed', 'email' => '[email protected]', 'reg_date' => 123]);

 

خروجی متغیر result در این مثال:

Array
(
    [execute] => Array
        (
            [:firstname] => mohsen
            [:lastname] => movahed
            [:email] => [email protected]
            [:reg_date] => 123
        )

    [sql] => INSERT INTO myguests (firstname,lastname,email,reg_date) VALUES (:firstname,:lastname,:email,:reg_date)
)

 

فایل پیوست

محسن موحد

توسط

محسن موحد

28 خرداد 99

حذف شده
آقای موحد دم شما گرم، این کد رو جدا اجرا کردم کار یه سوال من وقتی از یه جایی دیتا رو میگیرم و به این متد پاس میدم اجرا نمیشه ولی به طور تکی خود متد رو تو همون فایل صدا میزنم جواب میده من یه خورده به این namespace ها مشکوکم، به نظرتون این میتونه از namespace ها باشه؟
امیر صالحی

28 خرداد 99

حذف شده
جایی که این کلاسو دارید extend میکنید این کلاسو همراه با namespace اش use کنید. وقتی دیتارو پاس میدید به متد کافیه داخل این متد یه vardump از دیتا بگیرید ببینید اصلا چیزی ارسال شده یا نه. من تصوری از کدهای این پروژه ندارم مگر کامل بگذارید.
محسن موحد

28 خرداد 99

حذف شده
بله همه رو use میکنم و حتی var_dump هم میگریم و تمامی اطلاعات ارسال میشه ولی واقعا نمیدونم چرا کار نمیکنه
امیر صالحی

28 خرداد 99

حذف شده
خب پس اگه همه چیز درست ارسال میشه، خطای PDO رو چک کنید.
محسن موحد

28 خرداد 99

حذف شده
اقای موحد امکانش هست من پروژه رو آپلود کنم تو گیت هاب شما یه سری بهش بزنید مشکلو بررسی کنید؟
امیر صالحی

28 خرداد 99

حذف شده
آره. لینکو بذارید.
محسن موحد

29 خرداد 99

حذف شده
https://github.com/isamirsalehi/library این فایل Model که مشکل داشت توی پوشه‌ای به نام Bootstrap هست و متدشو توی فایل BookModel صدا میزنم و کار نمیکنه توی پوشه Model است برای اینکه بتونم به فرم html دسترسی داشته باشید تا تست کنید و داده وارد کنید، آدرس به این شکل میشه http://localhost/library/book/addBook این این لینک رو توی localhost باز کنید یک فرم براتون نمایش داده میشه و میتونید داده وارد کنید و تستش کنید تشکر ازتون
امیر صالحی

29 خرداد 99

حذف شده
فایل extract شده دیتابیس هم درون پوشه doc وجود داره میتونید از اون هم استفاده کنید تا وقتتون زیاد گرفته نشه
امیر صالحی

29 خرداد 99

0
حذف شده

این خط کدت رو به این شکل بنویس : 

به جای PDO نوشتین PDOAlias

        $this->dbh = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . "", DB_USER, DB_PASS);

 

فایل پیوست

میثم نصرتی

توسط

میثم نصرتی

28 خرداد 99

حذف شده
از این نیست، چندین بار اینکارو کردم
امیر صالحی

28 خرداد 99

حذف شده
کدت رو تست کردم تنها ایراد همون PDO بود کد کاملا کار کرد و فیلد جدید به دیتابیست اضافه شد اتصالات دیتابیست رو چک کن شاید مشکل ازوناست
میثم نصرتی

28 خرداد 99

حذف شده
آقا میثم، داخل namespace Bootstrap نمیشه PDO نوشت، مگر اینطوری نوشت PDO\
محسن موحد

28 خرداد 99

حذف شده
بله ممنون متوجه شدم حواسم به namespace که داده بودن نبود!!
میثم نصرتی

28 خرداد 99

0
حذف شده

سلام. یادت رفته یه : داخل ایندکس های execute بذاری:

$execute += [":$k" => $v];

به جای += به این شکل هم میتونی بنویسی:

$execute[':' . $k] = $v;

 

فایل پیوست

محسن موحد

توسط

محسن موحد

28 خرداد 99

حذف شده
ن متاسفانه، باز هم کار نکرد
امیر صالحی

28 خرداد 99

2
حذف شده

سلام مجدد.

این خطو بعد از ایجاد کانکشن PDO بذارید تا exception ای اگر اتفاق بیفته بره توو بلاک catch و خطارو نمایش بده:

$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

شما  در فرم اشتباهاً publish data نوشتید که در جدول وجود ندارد و در جدول فیلد publish date وجود دارد. مشکل برنامه همین فیلد هست که باید تصحیح کنید.

فایل پیوست

محسن موحد

توسط

محسن موحد

29 خرداد 99

حذف شده
سلام آقای موحد، آقا من عجیب غریب دوست دارم، دم شما گرم این دو روز اذیتت کردیم. ممنون ازت
امیر صالحی

29 خرداد 99

حذف شده
من مخلصم??
محسن موحد

29 خرداد 99