2014-12-30 4 views
2

Я программирую код с подготовленными операциями mysqli. Я начинаю и просто хочу спросить экспертов, если мой код верен.Правильный способ программирования mysqli подготовленного оператора

Мой код работает, но мне было интересно, как эксперт будет делать это :)

function getPaymentMethodName($id) { 
    global $mysqli; 
    if ($stmt = $mysqli->prepare('SELECT name FROM `payment_methods` WHERE id = ?')) { 
     if ($stmt->bind_param('i', $id)) { 
      if ($stmt->execute()) { 
       $stmt->bind_result($name); 
       if ($stmt->fetch()) { 
        $stmt->close(); 
        return $name; 
       } 
      } 
     } 
    } 
    $stmt->close(); 
    return false; 
} 

Надеется, что вы мне можете посоветовать.

Спасибо!

+6

Я думаю, что вы ищете [] (Просмотр Кода HTTP: // codereview.stackexchange.com/). –

+2

Наверное, избегайте использования глобального, но, возможно, вместо этого передайте $ mysqli в качестве аргумента; или использовать более основанный на классе подход –

+0

Ok Dave, спасибо! Я опубликую на CodeReview – user3800667

ответ

1

Взгляните на объект базы данных PHP. Его можно использовать для привязки запросов к mySQL. PDO является альтернативой mysqli. Это реализация того, как его настроить, привязать параметры и выполнить запросы.

http://php.net/manual/en/book.pdo.php

class Database 
{ 
    /* 
    * Database properties 
    */ 
    private $server = 'localhost'; 
    private $username = 'root'; 
    private $password = 'root'; 
    private $database = 'posts'; 
    public $pdo; 
    public static $instance; 

    /** 
    * Static method used to instantiate singleton 
    * @return [object] Database object 
    */ 
    public static function getInstance() 
    { 
     if (!isset($instance)) { 
      Database::$instance = new Database(); 
     } 
     return Database::$instance; 
    } 

    /** 
    * Connect to DB when class is instantiated 
    */ 
    private function __construct() 
    { 
     $this->connect(); 
    } 

    /** 
    * Connects to the database 
    */ 
    private function connect() 
    { 
     // Assign dsn string 
     $dsn = 'mysql:host=' . $this->server . ';dbname=' . $this->database; 

     try { 
      // Assign connection to $pdo 
      $pdo = new PDO($dsn, $this->username, $this->password); 
     } catch (PDOException $e) { 
      throw new pdoDbException($e); 
     } 

     // $pdo inside the method is added to the classes parameter pdo 
     $this->pdo = $pdo; 

    } 

    /** 
    * Queries database for the argument $sql 
    * @param string $sql 
    * @return Sql Query $statement 
    */ 
    public function query($sql) 
    { 
     // Prepare SQL query 
     $statement = $this->pdo->prepare($sql); 

     // return mysql query array 
     return $statement; 
    } 

    /** 
    * Queries for post of id $id 
    * @param [$id] Post ID 
    * @return [array] 
    */ 
    public function getPost($id) 
    { 
     // Query 
     $stmt = $this->query("SELECT * FROM posts WHERE id=(:id)"); 

     // Binds $id parameter to the PDO 
     $stmt->bindParam(':id', $id); 

     // Execute query 
     $stmt->execute(); 

     // Create an empty array for the posts 
     $posts = array(); 

     while($row = $stmt->fetch()) { 
      // Data is fetched from the database as an array 
      $posts[] = $row; 
     } 

     // Return post in an array 
     return $posts; 
    } 

} 
+0

В методе 'connect()' вы говорите, что он возвращает объект 'mysqli', но он ничего не возвращает – Yang

+0

Очень плохое представление о реализации. Он разрушает инкапсуляцию (поскольку свойства класса могут быть изменены после создания экземпляра), принцип SRP и смешивает PDO с mysqli – Yang

+0

К сожалению. да ты прав. Я изменил пример. –

0

Пример класса MySQLi обертка с preared утверждениями:

<?php 
    /** 
    * New Version 24/10/2014 
    * 
    * mb_internal_encoding('UTF-8'); 
    * mb_regex_encoding('UTF-8'); 
    */ 

    class miDB{ 
    private $result; 
    private $db; 

    // filter_var_array($set,FILTER_SANITIZE_STRING) 
    public function __construct($host,$user,$pass,$bbdd){ 
     $this->db = new mysqli($host,$user,$pass,$bbdd); 
     $this->db->set_charset("utf8"); 
     if ($this->db->connect_errno) { 
      throw new Exception ("Falló la conexión: ".$this->db->connect_error); 
     } 
    } 



    /** 
    * 
    * @param string $sql 
    * @param array $datos 
    * @param object $stmt 
    * 
    * @return 
    */ 
    private function preparaQuery($datos){ 
      $tipos = ''; 
      $conta = 1; 
      foreach($datos as $v){ 
       if (is_int($v)) { 
        $tipos .= 'i'; 
       }elseif(is_bool($v)){ 
        $tipos .= 'i'; 
       }elseif(is_float($v) || is_double($v)){ 
        $tipos .= 'd'; 
       }elseif('blob' == gettype($v)){ 
        $tipos .= 'b'; 
       }else{ 
        $tipos .= 's'; 
       } 
      } 
      $paramsDatos = array_merge(array($tipos), $datos); 
      $params = array(); 
      foreach($paramsDatos as $i=>$v){ 
       $params[$i] = &$paramsDatos[$i]; 
      } 
      return $params; 
    } 






    /** 
    * 
    * @param string $query 
    * @param array $datos 
    * 
    * @return 
    */ 
    public function insert($query,$datos=false){ 
     if(is_array($datos)){ 
      //consulta preparada 
      if($stmt = $this->db->prepare($query)){ 
        call_user_func_array(array($stmt, 'bind_param'), $this->preparaQuery($datos)); 
        if($stmt->execute()){ 
         $result = $stmt->affected_rows; 

        }else{ 
         throw new Exception ("Falló la consulta: ".$this->db->error); 
        } 
        if($result >= 1){ 
         $id = $stmt->insert_id; 
         $stmt->close(); 
         return $id; 
        }else{ 
         $stmt->close(); 
         return false; 
        } 
       }else{ 
        throw new Exception ("Falló : ".$this->db->error.' - '.$stmt->error); 
       } 
     }else{ 
      if($this->db->query($query)){ 
       return $this->db->insert_id; 
      }else{ 
       return false; 
      } 
     } 
    } 

    /** 
    * 
    * @param string $query 
    * @param array $datos 
    * 
    * @return 
    */ 
    public function update($query,$datos=false){ 
     if(is_array($datos)){ 
      //consulta preparada 
      if($stmt = $this->db->prepare($query)){ 
        call_user_func_array(array($stmt, 'bind_param'), $this->preparaQuery($datos)); 
        if($stmt->execute()){ 
         //$result = $stmt->get_result(); 
         $result = $stmt->affected_rows; 
         $stmt->close(); 
        }else{ 
         throw new Exception ("Falló la consulta: ".$this->db->error.' - '.$stmt->error); 
        } 
        if($result >= 1){ 
         return $result; 
        }else{ 
         return false; 
        } 
       }else{ 
        throw new Exception ("Falló : ".$this->db->error); 
       } 
     }else{ 
      $this->db->query($query); 
      return $this->db->affected_rows; 
     } 
    } 

    /** 
    * 
    * @param string $query 
    * @param array $datos 
    * 
    * @return 
    */ 
    public function delete($query,$datos=false){ 
     if(is_array($datos)){ 
      //consulta preparada 
      if($stmt = $this->db->prepare($query)){ 
        call_user_func_array(array($stmt, 'bind_param'), $this->preparaQuery($datos)); 
        if($stmt->execute()){ 
         //$result = $stmt->get_result(); 
         $result = $stmt->affected_rows; 
         $stmt->close(); 
        }else{ 
         throw new Exception ("Falló la consulta: ".$this->db->error.' - '.$stmt->error); 
        } 
        if($result >= 1){ 
         return $result; 
        }else{ 
         return false; 
        } 
       }else{ 
        throw new Exception ("Falló : ".$this->db->error); 
       } 
     }else{ 
      $this->db->query($query); 
      return $this->db->affected_rows; 
     } 
    } 

    /** 
    * 
    * @param string $query 
    * @param array $datos 
    * 
    * @return 
    */ 
    public function select($query,$datos=false){ 
     if(is_array($datos)){ 
      //consulta preparada 
      if($stmt = $this->db->prepare($query)){ 
       call_user_func_array(array($stmt, 'bind_param'), $this->preparaQuery($datos)); 
       if($stmt->execute()){ 
        $result = $stmt->get_result(); 
       }else{ 
        throw new Exception ("Falló la consulta: ".$this->db->error); 
       } 
       $miResult = array(); 
       while ($fila = $result->fetch_assoc()) { 
         $miResult[] = $fila; 
       } 
       $result->free(); 
       $stmt->close(); 
       return $miResult; 
      }else{ 
       throw new Exception ("Falló : ".$this->db->error); 
      }   
     }else{ 
      // consulta sin preparar 
      if ($result = $this->db->query($query)) { 
       $miResult = array(); 
       $result->data_seek(0); 
       while ($fila = $result->fetch_assoc()) { 
        $miResult[] = $fila; 
       } 
       $result->free(); 
       return $miResult; 
      }else{ 
       throw new Exception ("Falló : ".$this->db->error); 
       return false; 
      } 
     } 
    } 



    /** 
    * Get number of affected rows in previous MySQL operation 
    * @return integer 
    */ 
    public function AffectedRows() 
    { 
     return $this->db->affected_rows; 
    } 


    /** 
    * Get number of rows in result 
    * @return integer 
    */ 
    public static function Count() 
    { 
     return $this->db->count; 
    } 


    /** 
    * Get the ID generated in the last query 
    * @return integer 
    */ 
    public static function LastId() 
    { 
     return $this->db->insert_id; 
    } 




} 
?> 

Использование:

$db = new miDB('localhost','root',''); 
$sql = "INSERT INTO myTable (col1, col2, col3) VALUES (?, ?, ?)"; 
$data = array('foo',350, false); 
$db->insert($sql,$data); 
Смежные вопросы