2013-12-13 33 views
1

正在重做該網站。升級到mysqli,現在我正在用準備好的語句整理代碼和安全。我明白,聲明應該在foreach循環之外進行準備,但我對條件聲明感到好奇。mysqli準備好內部或外部語句,如果然後阻止

[code that decides $table] 
foreach ($_POST[$lastvar] as $key => $value) { 
[code not relevant to Q] 
$sql3 = "SELECT * from $table WHERE titlesid=? and peopleid=?"; 
$stmt3 = $mysqli->prepare($sql3); 
$stmt3->bind_param("ii", $titlesid,$peopleid); 
$stmt3->execute(); 
if ($stmt3->num_rows == 0) { 
    if ($table == "dhereviewers") { 
    $sql = "INSERT into $table (titlesid,peopleid) VALUES (?,?)"; 
    } else { 
    $sql = "INSERT into $table (titlesid,peopleid,billing) VALUES (?,?,?)"; 
    } 
$billing++; 
[prepare/execute one of the last two statements] 
} 
} 
} 

因此,根據'如果'我要去執行最後兩個插入中的一個或另一個。因爲他們是有條件的,我只有在他們被「選擇」時才做好準備嗎?

希望我很清楚。 :-)

還在學習準備好的陳述的繩索。

回答

0

由於參數的數量是兩個語句之間是不同的,它可能會更加清晰和綁定內部的if/then/else塊。

if ($table == "dhereviewers") { 
    $sql = "INSERT into $table (titlesid,peopleid) VALUES (?,?)"; 
    if ($stmt = $mysqli->prepare($sql)) { 
    $stmt->bind_param("ii", $titlesid, $peopleid); 
    } 
} else { 
    $sql = "INSERT into $table (titlesid,peopleid,billing) VALUES (?,?,?)"; 
    if ($stmt = $mysqli->prepare($sql)) { 
    $stmt->bind_param("iii", $titlesid, $peopleid, $billing); 
    } 
} 
$stmt->execute(); 

@MikeBrant有一個很好的觀點,在這個例子中,你可以更簡單地做到這一點。但這可能取決於您爲此問題排除的一些代碼。

PS:num_rows總是報告零行,直到您獲取所有行。你可以用fetch()來做到這一點,否則使用$mysqli->store_result()。見http://www.php.net/manual/en/mysqli-stmt.num-rows.php

+0

感謝num_rows上的領導。圍繞着新方法繼續包裹着我的腦袋。 – Ian

+0

@Ian,num_rows的行爲與mysql_num_rows()完全相同 - 僅適用於緩衝查詢。 –

+0

是的,抱歉...我現在面臨的更大的問題是「命令不同步」。試圖找出如何解決這個問題。 – Ian

2

您可以根據自己的建議有條件地確定準備好的對賬單。這裏沒有問題。唯一的問題是,對於你的情況,你需要了解選擇了哪個選項,以便知道綁定了多少個參數。

話雖這麼說,看着你的代碼,你可以考慮做一個INSERT ... SELECT查詢是這樣的:

INSERT INTO table_1 (field_1, field_2) 
SELECT field_1, field_2 FROM table_2 
WHERE field_x = ? 

,這樣你就不需要做了一大堆不同的查詢在一個循環。你應該可以用一個單一的查詢來做你想做的事情。

在INSERT

參見MySQL文檔。選擇語法在這裏:http://dev.mysql.com/doc/refman/5.5/en/insert-select.html

+0

謝謝...我會研究這一點。想知道它是否會工作,但選項一有兩個字段和選項2三。 – Ian

+0

@Ian當然,您只需根據表格做出決定,以決定是否需要執行三個提交的插入或兩個字段插入。這個決心可能不會和你目前的做法有什麼不同。 –