2013-03-19 35 views
0

我開發了一個將變量打印到mysql數據庫的函數。PHP - SQL Array插入代碼跳過第一個值

它看起來很好,除非它會在sql中記錄值時跳過第一個值。但是,所有3都與echo命令一起出現。換句話說,值1 2和3用echo打印 - 但只有2和3進入數據庫!插入

$xml = simplexml_load_file($url); 

$allcharacters = $xml->xpath('///result/rowset/row/@name'); 

foreach($allcharacters as $alts) { 
    $con=mysqli_connect("localhost","user","password","master"); 
    $sql="INSERT INTO masterlist (charactername) VALUES ('$alts')"; 
    mysqli_query($con,$sql); 
    echo "Found $alts<br />"; 

的樣本數據:

Found Tiamat's Shadow 
Found Troyd23 
Found Gore Innovater 
Gore Innovater 

有什麼建議?

+1

兩件事:首先,您能顯示您輸入的示例數據數據庫(例如'/// result/rowset/row/@ name'的值);第二,你是否嘗試過使用預先準備好的語句(也許這個字符會打破查詢)? – newfurniturey 2013-03-19 01:14:45

+0

http://www.repercussus.org/apply/test.php輸出結果在這裏可見,即。 echo「Found $ alts」的值;不確定你的意思與第二部分? – Troyd 2013-03-19 01:31:59

回答

0

當您將輸入插入到數據庫中時,您不會淨化您的輸入。

中的第一項,Found Tiamat's Shadow',傷了你的SQL查詢,因此實際上無法插入;這是由您的問題的問題「它會跳過第一個值」所證實的。

隨着MySQLi,你有兩個選擇來解決這個問題。

第一個是你可以使用mysqli_real_escape_string()逃脫你的數據:

$con=mysqli_connect("localhost","user","password","master"); 
foreach($allcharacters as $alts) { 
    $alts = mysqli_real_escape_string($con, $alts); 
    $sql="INSERT INTO masterlist (charactername) VALUES ('" . $alts . "')"; 
    ... 

使用此功能,任何「不安全」的字符將被自動插入到你的數據庫時逃脫。第二種方法是使用prepared statement。這將需要更多的代碼,但是,這樣做幾乎會始終保證您不會忘記偶然執行此操作。下面是用事先準備好的聲明的樣本:

$con=mysqli_connect("localhost","user","password","master"); 
foreach($allcharacters as $alts) { 
    $stmt = mysqli_prepare($con, "INSERT INTO masterlist (charactername) VALUES (?)"); 
    mysqli_stmt_bind_param($stmt, "s", $alts); 
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_close($stmt); 
    ... 

此方法是遠超過以前的健壯,因爲它會逃跑基於數據類型列的數據。它可能比您的特定用例所需要的多一點,但從不習慣使用預準備語句=]

+0

謝謝,我欣賞輸入和答案! – Troyd 2013-03-19 13:55:48