2015-10-04 93 views
-1

我想創建簡單的PDO mysql插入查詢語句以最乾淨和高效的方式。如何在PHP中使用冒號(:)和追加(,)數組值?

我的問題是,是否有任何簡單的函數可以追加和prepend數組值並將其轉換爲像implode()函數那樣的字符串呢?或者我做對了 - (請參閱我提供的上一個工作代碼)

糾正我,如果我錯了,我正在努力實現。

//key as field name value as value 
$field_values=array(
"firstname"=>$fname, 
"lastname"=>$lname, 
"phone"=>$phone); 

//field name would work fine as just a comma is appended to each array key 
//i need,if there is an inline way to perform array values to start with colon and end with comma. 
//this doesn't work as not comma is added inbetween 

$sql="INSERT INTO student (".implode(",",array_keys($field_values).") VALUES (".implode(":",$field_values).")"; 

//result wrong no commas 
//INSERT INTO student (firstname,lastname,phone) VALUES (:firstname:lastname:phone); 
//i want this 
//INSERT INTO student (firstname,lastname,phone) VALUES (:firstname,:lastname,:phone); 

我不能用這個太

$sql="INSERT INTO student (".implode(",",array_keys($field_values).") VALUES (?,?,?); 

我使用這個綁定

foreach($field_values as $field=>$value) 
{ 
    $dbh->bindValue(':'.$field,$value); 
} 

我知道我可以只寫一個字符串像:firstname,:lastname,:phone實現這一目標,也可以與正則表達式或使用foreach循環來追加和prepend像這樣。 這將正常工作,但其漫長

$fv=""; 
    foreach($field_values as $field=>$value) 
    { 
     $fv.=":".$field.","; 
    } 
    $fv=rtrim($fv, ","); 
    $sql="INSERT INTO student (".implode(",",$field_values).") VALUES (".$fv.")"; 

,但我想知道是否有辦法做到這一點有點像我的代碼上面使用的東西。在這種情況下數組鍵可能會改變,所以我正在尋找一種動態高效的方式。

幫幫我:) 任何幫助表示讚賞。

預先感謝您。

+0

如果向下票選請讓我知道爲什麼嗎? :)爲什麼在這裏隨機調低了一個習慣:/ – aimme

+1

沒有這樣的事情隨機向下投票堆棧溢出(機器人撿起它,如果它發生逆轉)。我不明白爲什麼你的問題應該被投票,所以有一個投票來平衡它 –

+0

thanx @RobbieAverill :) – aimme

回答

-1

如果你不想使用foreach在增加:對於列名,你可以嘗試這樣的事情

$fname = "first"; 
$lname = "last"; 
$phone = "2342344"; 
$field_values=array(
"firstname"=>$fname, 
"lastname"=>$lname, 
"phone"=>$phone 
); 

echo "INSERT INTO student (`:".implode("`,:`",$field_values)."`) VALUES (".$fv.")"; 

,你可以在插入列中看到我添加了一個`:對存在並結束於列支架

+1

您綁定的值不是列名稱 –

+0

thanx。但它錯了。 :) – aimme

0

此PDO插入函數將接受一個數組作爲輸入。

// Insert an array with key-value pairs into a specified MySQL database table. 
function pdo_insert($dbh,$table,$keyvals) { 
    $sql = sprintf("INSERT INTO %s (`%s`) %sVALUES (:%s);", 
     $table, 
     implode("`, `", array_keys($keyvals)), 
     implode(", :", array_keys($keyvals)) 
    ); 
    $stmt = $dbh->prepare($sql); 
    foreach ($keyvals as $field => $value) { 
     $stmt->bindValue(":$field", $value, PDO::PARAM_STR); 
    } 
    $stmt->execute(); 
    return $dbh->lastInsertId(); 
} 

// Convert special characters to HTML safe entities. 
function h($str) { 
    return trim(stripslashes(htmlspecialchars($str, ENT_QUOTES, 'utf-8'))); 
} 

例子:

$dbh = new PDO($dsn); 
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$keyvals = [     
    'id' => isset($_POST['id']) ? h($_POST['id']) : null, 
    'title' => isset($_POST['title']) ? h($_POST['title']) : null,  
    'description' => isset($_POST['description']) ? h($_POST['description']) : null, 
    'created_at' => time(), 
    'created_by' => 1, 
]; 
$last_ids[] = pdo_insert($dbh,'products',$keyvals); 
+0

這個函數容易被sql注入 –

+0

@YourCommonSense是嗎? –

+0

@YourCommonSense:已修復。順便說一下,當我使用這個pdo_insert函數時,我實際上已經考慮到了你的SafeMySQL腳本。 –

相關問題