Проблемы с параметрами привязки

#php #sql #pdo #foreach #binding

#php #sql #pdo #предначертание #обязательный

Вопрос:

Я просмотрел все другие вопросы, заданные на SO, и мне не повезло найти проблему в моем коде. Я пытаюсь обновить базу данных с помощью метода Update(). Мой метод Insert() запущен и запущен, но я получаю вышеуказанную ошибку при запуске кода. Кажется, это ошибка при привязке моих значений. Не мог бы кто-нибудь, пожалуйста, дать мне несколько советов? Спасибо.

 <?php 


class DB{

    private static $_instance = null;
    private $_pdo,$_query,$_error = false, $_result, $_count = 0, $_lastInsertID = null;

    private function __construct(){

        try{
            $this->_pdo = new PDO('mysql:host='.DB_HOST.';port=3307;dbname='.DB_NAME , DB_USER, DB_PASSWORD);
        }catch(PDOException $e){
            die($e->getMessage());

        }
    }
 
    public static function getInstance(){
        if(!isset(self::$_instance)){
            self::$_instance = new DB();
        }
        return self::$_instance;
    }


    public function query($sql, $params = []){
        $this->_error = false;
        if($this->_query = $this->_pdo->prepare($sql)){     
            //binds paramaters
            $x = 1;
            if(count($params)){
                foreach($params as $param){
                    $this->_query->bindValue($x, $param);
                    $x  ;
                }
            }
    
            if ($this->_query->execute()){
                $this->_result = $this->_query->fetchALL(PDO::FETCH_OBJ);
                $this->_count = $this->_query->rowCount();
                $this->_lastInsertID = $this->_pdo->lastInsertId();
            } else{
                $this->error = true;
            }
        }
        return $this;
    }

    public function insert($table,$fields=[]){
        $fieldString = '';
        $valueString = '';
        $values = [];
    
        foreach( $fields as $field => $value){
            $fieldString .= '`'. $field . '`,';
            $valueString .= '?,';
            $values[] = $value; 
        }
        $fieldString = rtrim($fieldString, ',');
        $valueString = rtrim($valueString, ',');
        $sql = "INSERT INTO {$table} ({$fieldString}) VALUES ({$valueString})";
        if(!$this->query($sql, $values)->error()){
            return true;
        }else{
            return false;
        }
    }

    public function update($table, $id, $fields = []){
        $fieldString = '';
        $values = [];
        foreach($fields as $field => $value){
            $fieldString .= ' ' . $field . ' = ?,';
        }
        $fieldString = trim($fieldString);
        $fieldString = rtrim($fieldString, ',');
        $sql = "UPDATE {$table} SET {$fieldString} WHERE id = {$id}";
        $obj = $this->query($sql,$values);
        dnd($obj);
        if(!$this->_query($sql,$values)->error()){
            return true;
        }
        return false;
    }

    public function error(){

        return $this->_error;
    }

}
?>

<?php 

class Home extends Controller{
    
    public function __construct($controller,$action){
        parent::__construct($controller, $action);
    }

    public function indexAction(){
        //die('welcome to the home controller this is the index action.');
        $db = DB::getInstance();
        $fields = [
            'fname'=> 'Jared',
            'email'=>'JBowser@123.com'];

            
        //$contacts = $db->insert('contacts',$fields);  This is how we insert to our DB. 
        $contacts = $db->update('contacts',3, $fields); // This is how we update our DB.

        $this->view->render('home/index'); ///path from views directory **
    }

}
 

Комментарии:

1. Пожалуйста, не просто помещайте ошибку в заголовок

2. Возможно, вам захочется повторить / сбросить ваш $sql, а также $values в вашей функции обновления, просто чтобы посмотреть, что они содержат

3. Пожалуйста, не добавляйте РЕШАЕМЫЙ в заголовок! Это решается, когда принимается ответ

Ответ №1:

Вы не загружаете массив значений в методе обновления

 public function update($table, $id, $fields = []){
    $fieldString = '';
    $values = [];
    foreach($fields as $field => $value){
        $fieldString .= ' ' . $field . ' = ?,';
        $values[] = $value;                         // <<-- Added this line
    }
    $fieldString = trim($fieldString);
    $fieldString = rtrim($fieldString, ',');
    $sql = "UPDATE {$table} SET {$fieldString} WHERE id = {$id}";
    $obj = $this->query($sql,$values);
    dnd($obj);
    if(!$this->_query($sql,$values)->error()){
        return true;
    }
    return false;
}
 

Комментарии:

1. Спасибо всем за быстрые ответы. Я думаю, мне нужно было сделать шаг в сторону от моего кода и вернуться.