2014-09-12 57 views
0

我試圖刪除PHP中某個SQL Server查詢的某些字段內的撇號,儘管事實上我在字符串模式部分中添加了多餘的' ,如果在結果中找到撇號,它仍然會出錯。我不確定我在這裏做錯了什麼,任何幫助都將非常感謝!SQL Server替換php變量中的撇號

代碼的這部分循環遍歷網頁抓取的每一行結果並將其引發到每個結果的新錶行中。該功能可以正常工作,但只要查詢返回撇號,它就會錯誤並中斷循環。

for($i = 1, $max = count($table); $i < $max; ++$i) { 
$dbrow = $table[$i]; 
$insquery = "INSERT INTO db.schema.table (EVENT_ID, EVENT_CODE, DESCRIPTION, 
STATUS, SITE_STATUS, CITY, COUNTY, ZIP, STATE, STARTDATE, ENDDATE, YEARS_PRIOR, TOTAL_PRICE, 
CUSTODIAN_FEE, ESTIMATED_FEES, FEE_TYPE, SD, PROGRAM, RC_LN, BUF_AMOUNT, LOC_PREM, 
ST_PREM, SNAPSHOT_DATE) VALUES('".$dbrow[0]."','".$dbrow[1]."', replace('".$dbrow[2]."','''', ''),'".$dbrow[3]."','".$dbrow[4]."', replace('".$dbrow[5]."','''', ''), replace('".$dbrow[6]."','''', ''),'".$dbrow[7]."','".$dbrow[8]."','".$dbrow[9]."','".$dbrow[10]."','".$dbrow[11]."','".$dbrow[12]."','".$dbrow[13]."','".$dbrow[14]."','".$dbrow[15]."', replace('".$dbrow[16]."','''', ''), replace('".$dbrow[17]."','''', ''), replace('".$dbrow[18]."','''', ''), replace('".$dbrow[19]."','''', ''),'".$dbrow[20]."','".$dbrow[21]."','".$dbrow[22]."');"; 
sqlsrv_query($conn, $insquery) or die ("Error in query: $insquery. ".sqlsrv_errors()); 
echo $insquery . "<br>"; 
}; 

回答

0

當然是的。您試圖用SQL本身替換撇號。請考慮以下聲明:

replace('don't','''', '') 

SQL Server應如何評估?它打開一個字符串,然後在三個字母關閉該字符串後,遇到一個錯誤的t字符,導致語法錯誤。

查詢本身需要在語法上有效,SQL才能執行它。 SQL無法在其自己的代碼中修復語法錯誤。您需要在PHP中更換單引號,而不是SQL。

無論如何,這裏都有一個非常簡潔的解決方案。 Prepared statements。根本不用擔心引用,讓引擎爲你處理。例如:

$sql = "INSERT INTO Table_1 (id, data) VALUES (?, ?)"; 
$params = array(1, "some data"); 

$stmt = sqlsrv_query($conn, $sql, $params); 

這當然是有幫助保護您免受SQL injection attacks,有事當前您的代碼很可能不堪一擊額外的好處。

+0

謝謝,完美的工作! – therecluse26 2014-09-15 13:51:34