php post:用双单替换单引号,用于sqlserver查询

时间:2017-06-22 08:03:19

标签: php sql-server yii2

我的$POST值是“WYNN'S”。当我通过Yii2框架创建一个SQL查询时:

$vendor = (new Query()) ->select('VendorNo') ->distinct() ->from('Pm_Item i') ->innerJoin('[PurchPrice] [p]', 'p.ItemNo = i.ItemNo AND p.CompanyKey = i.CompanyKey') ->where($condition)->all();

我收到错误:

Incorrect syntax near 'S'. The SQL being executed was: SELECT DISTINCT [TopCode] FROM [PM_Item] WHERE Brand IN( 'WYNN'S')

如何使用php将'WYNN''替换为'WYNN'''?

更新:

    $condition = '';
    $i = 0;
    foreach ($filters as $filter) {
        if (isset($filter['selected'])) {
            if (strpos( $filter['selected']['value'], "'") !== false) {
                $filter['selected']['value'] =  str_replace("'", "''", $filter['selected']['value']); //preg_replace('/\'/', '\'\'', $filter['selected']['value']);
            }
            if ($i != 0 AND $filter['selected']['value'] != '') {
                $condition .= ' AND i.' . $filter['column'] . ' = \'' . $filter['selected']['value'] . '\'';
            } elseif ($filter['selected']['value'] != '') {
                $condition .= 'i.' . $filter['column'] . ' = \'' . $filter['selected']['value'] . '\'';
            }

            $i++;
        }
    }

5 个答案:

答案 0 :(得分:1)

使用addslashes()为字符串

的特殊字符添加反斜杠
$str = addslashes("WYNN'S");

然后传递给sql查询。

答案 1 :(得分:0)

str_replace()函数似乎这样做:

<?php
  $query = str_replace("'", "''" , $query);
?>

这将取代每一次出现的事情。其中2个:&#39;&#39;。

答案 2 :(得分:0)

你应该转义sql语句中的特殊字符

如果您使用的是 mysqli 扩展,请使用 mysqli :: real_escape_string 来翻译字符串中的特殊字符,以便在SQL语句中使用(包括单引号)

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

对于 PDO 扩展,请使用 PDO :: quote PDO准备

如果您使用的是不推荐使用的mysql扩展,则可以使用 mysql-real-escape-string

http://php.net/manual/en/function.mysql-real-escape-string.php

示例:

$lastname  = "O'Reilly";
$_lastname = mysql_real_escape_string($lastname);
$query = "SELECT * FROM actors WHERE last_name = '$_lastname'"; 

答案 3 :(得分:0)

我更喜欢编写一个转义函数,并将其用于查询中的每个值:

function escape_sql(string $string) 
{
   return str_replace("'", "''", $string);
}

$query = "SELECT DISTINCT [TopCode] 
          FROM [PM_Item] 
          WHERE  Brand IN( '". escape_sql("WYNN'S"). "')";
?>

或者选择PDO方法,让PHP可以使用->prepare()->bindValue()

来解决问题

答案 4 :(得分:0)

我注意到你使用yii已经太晚了。

部分 - &gt; where()不一定是这样的:

- &gt; where(['in','Brand',[“WYNN'S”]])

根据http://www.yiiframework.com/doc-2.0/yii-db-query.html#where()-detail,这将导致由yii

逃避