• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
statement و PDO_mysql
#1
خب، وحید حسابی منو گیج کردی. Big Grin
بحث رو روشن کن تا کلاسش رو هر چه زودتر بنویسم.

در مورد اون statement چند تا مقاله خوندم و از همه مهمتر اون لینکی رو که داده بودی رو دیدم.

اما نفهمیدم سر این کلاس فعلی PDO باید چه بلایی بیارم Huh

یکی یه مثال ساده از روی pdo خودم بزنه عالیه Blush

بعدشم، محمد امین، چرا پوشه بندی/ساختار db رو نزدی؟
هر چیزی که در جستن آنی آنی...
غایب
  پاسخ
تشکر شده توسط : Reza
#2
ببین تغییرات برای هر Adapter یه Satement داریم. من مثالش رو از ZF2 برمیدارم

کد:
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link      http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license   http://framework.zend.com/license/new-bsd New BSD License
* @package   Zend_Db
*/

namespace Zend\Db\Adapter\Driver\Pdo;

use Zend\Db\Adapter\Driver\StatementInterface;
use Zend\Db\Adapter\Exception;
use Zend\Db\Adapter\ParameterContainer;

/**
* @category   Zend
* @package    Zend_Db
* @subpackage Adapter
*/
class Statement implements StatementInterface
{

    /**
     * @var \PDO
     */
    protected $pdo = null;

    /**
     * @var Pdo
     */
    protected $driver = null;

    /**
     *
     * @var string
     */
    protected $sql = '';

    /**
     *
     * @var boolean
     */
    protected $isQuery = null;

    /**
     *
     * @var ParameterContainer
     */
    protected $parameterContainer = null;

    /**
     * @var bool
     */
    protected $parametersBound = false;

    /**
     * @var \PDOStatement
     */
    protected $resource = null;

    /**
     *
     * @var boolean
     */
    protected $isPrepared = false;

    /**
     * Set driver
     *
     * @param  Pdo $driver
     * @return Statement
     */
    public function setDriver(Pdo $driver)
    {
        $this->driver = $driver;
        return $this;
    }

    /**
     * Initialize
     *
     * @param  \PDO $connectionResource
     * @return Statement
     */
    public function initialize(\PDO $connectionResource)
    {
        $this->pdo = $connectionResource;
        return $this;
    }

    /**
     * Set resource
     *
     * @param  \PDOStatement $pdoStatement
     * @return Statement
     */
    public function setResource(\PDOStatement $pdoStatement)
    {
        $this->resource = $pdoStatement;
        return $this;
    }

    /**
     * Get resource
     *
     * @return mixed
     */
    public function getResource()
    {
        return $this->resource;
    }

    /**
     * Set sql
     *
     * @param string $sql
     */
    public function setSql($sql)
    {
        $this->sql = $sql;
        return $this;
    }

    /**
     * Get sql
     *
     * @return string
     */
    public function getSql()
    {
        return $this->sql;
    }

    /**
     * @param ParameterContainer $parameterContainer
     */
    public function setParameterContainer(ParameterContainer $parameterContainer)
    {
        $this->parameterContainer = $parameterContainer;
        return $this;
    }

    /**
     * @return ParameterContainer
     */
    public function getParameterContainer()
    {
        return $this->parameterContainer;
    }

    /**
     * @param string $sql
     */
    public function prepare($sql = null)
    {
        if ($this->isPrepared) {
            throw new Exception\RuntimeException('This statement has been prepared already');
        }

        if ($sql == null) {
            $sql = $this->sql;
        }

        $this->resource = $this->pdo->prepare($sql);

        if ($this->resource === false) {
            $error = $this->pdo->errorInfo();
            throw new Exception\RuntimeException($error[2]);
        }

        $this->isPrepared = true;
    }

    /**
     * @return bool
     */
    public function isPrepared()
    {
        return $this->isPrepared;
    }

    /**
     * @param mixed $parameters
     * @return Result
     */
    public function execute($parameters = null)
    {
        if (!$this->isPrepared) {
            $this->prepare();
        }

        /** START Standard ParameterContainer Merging Block */
        if (!$this->parameterContainer instanceof ParameterContainer) {
            if ($parameters instanceof ParameterContainer) {
                $this->parameterContainer = $parameters;
                $parameters = null;
            } else {
                $this->parameterContainer = new ParameterContainer();
            }
        }

        if (is_array($parameters)) {
            $this->parameterContainer->setFromArray($parameters);
        }

        if ($this->parameterContainer->count() > 0) {
            $this->bindParametersFromContainer();
        }
        /** END Standard ParameterContainer Merging Block */

        try {
            $this->resource->execute();
        } catch (\PDOException $e) {
            throw new Exception\InvalidQueryException('Statement could not be executed', null, $e);
        }

        $result = $this->driver->createResult($this->resource, $this);
        return $result;
    }

    /**
     * Bind parameters from container
     *
     * @param ParameterContainer $container
     */
    protected function bindParametersFromContainer()
    {
        if ($this->parametersBound) {
            return;
        }

        $parameters = $this->parameterContainer->getNamedArray();
        foreach ($parameters as $name => &$value) {
            $type = \PDO::PARAM_STR;
            if ($this->parameterContainer->offsetHasErrata($name)) {
                switch ($this->parameterContainer->offsetGetErrata($name)) {
                    case ParameterContainer::TYPE_INTEGER:
                        $type = \PDO::PARAM_INT;
                        break;
                    case ParameterContainer::TYPE_NULL:
                        $type = \PDO::PARAM_NULL;
                        break;
                    case ParameterContainer::TYPE_LOB:
                        $type = \PDO::PARAM_LOB;
                        break;
                    case (is_bool($value)):
                        $type = \PDO::PARAM_BOOL;
                        break;
                }
            }

            // parameter is named or positional, value is reference
            $parameter = is_int($name) ? ($name + 1) : $name;
            $this->resource->bindParam($parameter, $value, $type);
        }

    }

    /**
     * Perform a deep clone
     * @return Statement A cloned statement
     */
    public function __clone()
    {
        $this->isPrepared = false;
        $this->parametersBound = false;
        $this->resource = null;
        if ($this->parameterContainer) {
            $this->parameterContainer = clone $this->parameterContainer;
        }

    }

}

یه همچین چیزی. حالا توی Adapter مثلا یه تابع میزاریم به اسم getStatement که از این کلاس بر می گردونه
  پاسخ
تشکر شده توسط : undefined
#3
@احسان
اول اینکه PDOdatabase.php غلطه، و باید بشه PDO.php - چون داخل پوشه Db هست خودش

بعد اینکه کلاس تو کلاً ترکیده Angel، که گرفته query و result و command رو یکی کرده! و بنظرم بهتره جدا جدا بشن داخل یک پوشه PDO که حاوی 3-4 چهار فایل باشه - query result manager... و یک factory در راس همه پوشه های db
ها؟ Idea


در ضمن کامیتمو مرج کن بعدم ببندش. core رو حذف کردم


تکلیف این رجیستری رو هم معلوم کنید - بالاخره لازمه یا نه
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط : undefined
#4
این @ هه هم خوبه ها؟
یه پلاگینی چیزی براش نیست...؟
که مثل irc خودش link بشه
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط : Reza
#5
نقل قول:بعدشم، محمد امین، چرا پوشه بندی/ساختار db رو نزدی؟
مشکلات گیتی دارم! Dodgy
دو سه روزه تو اسباب کشیم، دو سه روز دیگه هم ادامه داره. Sleepy
  پاسخ
تشکر شده توسط :
#6
یوشا رجیستری رو بزار
  پاسخ
تشکر شده توسط :
#7
ساختار کتابخونه نیاز به اصلاح داره.
من دست به این ساختار زده ام منتهاش اول باید درخواست مرجی که دادم قبول بشه ( @احسان Big Grin )
  پاسخ
تشکر شده توسط :
#8
وحید کلاس رجیستری شی باشه یا ایستا؟
بعدم final ش بکنم؟
لینک کردنش با کیه؟ Angel
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط :
#9
لینک کردن یعنی چی؟
هم استاتیک و هم شی.
فینال بودن هم ضروریه مگه ؟
  پاسخ
تشکر شده توسط :
#10
نقل قول:لینک کردن یعنی چی؟
یعنی وصل و هم بندی بشه با بقیه قسمت ها.
سازگار بشه


نقل قول:هم استاتیک و هم شی.
چه خبره؟ Huh
چرا هر دو؟


نقل قول:فینال بودن هم ضروریه مگه ؟
نه
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط :


پرش به انجمن:


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