2013-10-16 58 views
1

可以說我有這樣的代碼:綁定值插入到DB

$array = array('one' => $one, 'two' => $two); 
$sql->sql_insert('table_name', $array); 

我有類對象$sql和功能sql_insert,但我會怎麼使用的mysqli準備語句綁定的價值觀和將它插入數據庫?並可以說mysqli connection$this->connection

任何意見將是非常感謝。

編輯:

function sql_insert_bind($table, $insert){ 

    $count = count($insert); 
    $bind_val = ''; 
    for($i = 0; $i <= $count; $i++){ 

     $bind_val .= '?, '; 
    } 

    $query = $this->connection->prepare('INSERT INTO `'.$table.'` VALUES ('.substr($bind_val, 0, -2).')'); 

    foreach($insert as $key => $value){ 

     $query->bind_param($key, $value); 
    } 

    $query->execute(); 
} 

我得到的錯誤信息:Fatal error: Call to a member function bind_param() on a non-object$this->connection是mysqli的對象

+0

見編輯的代碼爲我的嘗試。謝謝 – Jay

+0

我知道你已經在使用MySQLi,但在這種情況下PDO的API將更容易使用 – Phil

+0

什麼更好? PDO還是Mysqli?我現在正在重寫我的sql類,所以它並不重要。你有這樣的PDO樣本嗎?謝謝 – Jay

回答

2

好的,我將如何用PDO來解決這個問題(自OP問起)

我會假設你已經實例化或注入一個PDO對象到您的類作爲$connection屬性,如

class SQLClass { 
    /** 
    * @var PDO 
    */ 
    private $connection; 

    public function __construct(PDO $pdo) { 
     $this->connection = $pdo; 
    } 

    // etc 
} 

$pdo = new PDO('mysql:host=localhost;dbname=db_name;charset=utf8', 'username', 'password', array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_EMULATE_PREPARES => false, 
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC)); 

$sql = new SQLClass($pdo); 

然後,在你sql_insert_bind方法

$keys = array_keys($insert); 

$cols = array_map(function($key) { 
    return sprintf('`%s`', $key); 
}, $keys); 

$placeholders = array_map(function($key) { 
    return sprintf(':%s', $key); 
}, $keys); 

$params = array_combine($placeholders, $insert); 

$query = sprintf('INSERT INTO `%s` (%s) VALUES (%s)', 
    $table, implode(',', $cols), implode(',', $placeholders)); 

$stmt = $this->connection->prepare($query); 
$stmt->execute($params); 
+0

這會使用綁定函數來安全保護值嗎?如不需要手動轉義值? – Jay

+0

@Jay是的。 'PDOStatement :: execute'綁定傳遞給它的參數。請參閱http://php.net/manual/pdostatement.execute.php#refsect1-pdostatement.execute-參數 – Phil

+0

這很好。一件事情。在我的數組中,有些值可以是'now()'或'NULL'或''(無)。因爲'now()'是我該如何解決這個問題的時候?謝謝隊友 – Jay

1

你應該每個變量綁定seperately,bind_param將接受很多變量綁定:

$array = array('one' => $one, 'two' => $two); 
$query = $sql->prepare("INSERT INTO `table` VALUES (?, ?)"); 
$query->bind_param('ss', $array['one'], $array['two']); 
$query->execute(); 
// inserted 
+0

這意味着'sql_insert'方法需要了解通過'$ array'參數傳入的參數。 – Phil