2013-07-09 119 views
1

所以在我最近的話題之後,我瞭解了PDO。我正在盡我所能去理解它,並努力工作。但現在的問題是,我的新pdo腳本不會插入和更新,如果存在數據庫中。現在我在這裏問它,因爲我是PDO的首發者,並且我正在盡力而爲。PDO插入和更新

現在這是我使用的代碼。

$db->prepare(
'INSERT INTO track (`rsname`, `overallranknow`, `overalllevelnow`, `overallxpnow`)' . 
'VALUES (' .$name. '. ' .$Overalln. ', ' .$Overall[1]. ', ' .$Overall2. ') '. 
'ON DUPLICATE KEY UPDATE ' . 
    "rsname = ' .$name. '" . 
    "overallranknow = ' .$Overalln. ' " . 
    "overalllevelnow = ' .$Overall[1].' " . 
    "overallxpnow = ' .$Overall2. ' " 
); 

的代碼是一樣無所事事現在

- 它不插入到數據庫中。

- 它沒有更新到數據庫中。

而且我的數據庫連接文件是這樣的

<?php 
$config['db'] = array(

'host'   => 'localhost', 
'username'  => '', 
'password'  => '', 
'dbname'  => '' 
); 

$db = new PDO('mysql:host=' . $config['db'] ['host'] . ';dbname=' . $config['db'] ['dbname'], $config['db'] ['username'], $config['db'] ['password']); 

也許我張貼mutch問題在這裏,我知道,但我想了解它。

〜千電子伏(英語不好=對不起)

+0

這是偉大的,你使用的PDO,但你**不能**寫SQL代碼這種方式,而不會引入嚴重[SQL注入漏洞( http://bobby-tables.com/)。您的查詢應該看起來像INSERT INTO track(...)VALUES(:name,:Overalln,:Overall1,Overall2)...',然後在執行調用期間將值綁定到這些佔位符:execute(array ('name'=> $ name,'Overalln'=> $ Overalln,'Overall1'=> $ Overall [1],'Overall2'=> $ Overall2))''。 – tadman

+0

@tadman感謝您的評論!但是你認爲「執行」是什麼意思?你可以把它放在我發佈的代碼中嗎? – Kev30

+0

另外我想更新表,如果它存在可能? – Kev30

回答

0

已準備語句需要竟然打數據庫,以便執行。

你應該調整它看起來更像是這樣的:

$sth = $db->prepare(
    'INSERT INTO track (`rsname`, `overallranknow`, `overalllevelnow`, `overallxpnow`)' . 
    'VALUES (:name, :Overalln, :Overall1, :Overall2) '. 
    'ON DUPLICATE KEY UPDATE ' . 
    "rsname = :name" . 
    "overallranknow = :Overalln" . 
    "overalllevelnow = :Overall1" . 
    "overallxpnow = :Overall2" 
); 

$sth->execute(array('name' => $name, 'Overalln' => $Overalln, 'Overall1' => $Overall[1], 'Overall2' => $Overall[2])); 
+0

這個工作,但爲了參考和新手用戶,我會添加一個'bindValue',這使得代碼更易於閱讀和調試。一旦你這樣做,你會有我的+1 –

+0

此外,我會寫查詢作爲一個單一的字符串,而不是串聯的許多字符串。 –

+0

構建字符串是一個偏好問題,所以我只保留@ Kev30在那裏。用命名參數執行並不壞,在這裏應該很清楚發生了什麼。 'bindValue'往往是相當詳細的,並不會增加太多的清晰度。 – tadman