2013-01-18 61 views
0

我試圖用PHP創建一個SQL查詢,在這個查詢中它檢查一行是否已經使用相同的日期和用戶名提交/設置。如果它沒有插入一個新行。如果它找到匹配項,它會更新行。使用PHP PDO的SQL查詢

我可以插入新行,但是當我使用預先存在的日期和名稱時,我的任何日誌中都沒有收到任何錯誤,並且查詢看起來沒有任何問題。但是在檢查數據庫時,我注意到沒有實際設置到該行的UPDATES。當我在SQL中手動運行更新命令時,它看起來工作正常。

沒有日誌/錯誤數據繼續,我希望在這裏得到一些建議。我敢肯定,我一定會在這裏失去一些東西。這是我目前使用:

require_once 'db-conn.php'; 

$name = $_POST['name']; 
$email = $_POST['email']; 
$date = $_POST['date']; 
$var1 = $_POST['var1']; 
$var2 = $_POST['var2']; 
$var3 = $_POST['var3']; 
$var4 = $_POST['var4']; 

$conn = db_connect(); 
$sqlq = "SELECT * FROM tbl WHERE date = '$date' AND name = '$name'"; 
$nRows = $conn->query("$sqlq")->fetchColumn(); 

if ($nRows==0) { 
try { 
    $sqli = "INSERT INTO tbl (name,email,date,var1,var2,var3,var4) VALUES (:name,:email,:date,:var1,:var2,:var3,:var4)"; 
    $sql = $conn->prepare("$sqli"); 
    $sql->execute(array(':name' => $name, ':email' => $email, ':date' => $date, ':var1' => $var1, ':var2' => $var2, ':var3' => $var3 ':var4' => $var4)); 
} catch(PDOException $e) { 
    die ('SQL Error'); 
    } 
} 
else { 
try { 
    $sqli = "UPDATE tbl SET email='$email', notes='$notes', var1='$var1', var2='$var2', var3='$var3' WHERE date='$date' AND name='$name'"; 
    $sql = $conn->prepare("$sqli"); 
    $sql->execute(array($name, $email, $date, $var1, $var2, $var3, $var4)); 
} catch(PDOException $e) { 
    die ('SQL Error'); 
} 

}

+1

請注意您的SELECT語句;你直接輸入兩個unsanitized變量。我也準備這個聲明。 –

回答

4

您不必綁定變量的正確:

$sqli = "UPDATE tbl SET email=:email, notes=:notes, var1=:var1, var2=:var2, var3=:var3 WHERE date=:date AND name=:name"; 
$sql = $conn->prepare("$sqli"); 
$sql->execute(array(':name' => $name, ':email' => $email, ':date' => $date, ':var1' => $var1, ':var2' => $var2, ':var3' => $var3, ':notes'=>$notes)); 

你們這樣做是在INSERT語句正確的,但不是在更新。

不知道你從哪裏得到$notes

另外不確定是否有意或無意更新查詢中的var4。

+0

我忘了用$ var#:)掩蓋$ notes。當我在這裏張貼時,我傾向於掩蓋我獨特的var名字,嘿。我將嘗試所提到的更改,其中變量被限制在我的UPDATE查詢中。謝謝! – Nikita

+0

我已更新查詢以包含綁定變量,但PDOException在運行UPDATE查詢時報告以下內容: 帶有消息'SQLSTATE [HY093]的異常'PDOException':temp.html中的無效參數號堆棧跟蹤:#0 temp .html(34):PDOStatement-> execute(Array)#1 temp-php.php(18):include('/ xxx/xxx/incl ...')#2 {main} – Nikita

+0

這意味着' :'$ sqli'中的variables'與'execute()'中的數組中發送的變量數量不匹配,請確保它們匹配。 – Pitchinnate