SQL Server替换php变量中的撇号

时间:2014-09-12 19:45:51

标签: php sql sql-server replace escaping

我试图在PHP中的SQL Server查询的某些字段中删除撇号,尽管事实上我正在投入额外的一组'字符串模式部分,在结果中找到撇号时仍然出错。我不确定我在这里做错了什么,任何帮助都会非常感激!

代码的这一部分循环遍历web scrape的每一行结果,并将其抛出到每个结果的新表行中。该功能有效,但只要查询返回撇号,它就会出错并中断循环。

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>";
};

1 个答案:

答案 0 :(得分: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的攻击,这是您当前代码很容易受到攻击的地方。