2014-09-12 35 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