2017-06-22 167 views
-1

我的$POST值为“WYNN'S”。当我创建通过Yii2框架SQL查询:php post:用sqlserver查询替换单双引号的单引号

$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?

UPDATE:

$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++; 
     } 
    } 
+1

你可以显示你创建这个sql查询的代码吗? – Jerodev

+0

我使用Yii2框架:'$ 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();' – Lyuba

+0

https://stackoverflow.com/a/130323/7926064 – BNT

回答

0

的str_replace()函数的功能似乎这样做:

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

将取代的每一次出现“与他们的2: ''。

+0

请注意,虽然这可能有效,但它总是最好彻底逃避userinput,如[这里](https://stackoverflow.com/a/130323/7926064) – BNT

+0

这不起作用,当我为sql查询创建$条件时,我已经将WYNN'S包装为单引号,并且用double替换single不会影响串 – Lyuba

0

使用和addslashes()添加反斜线befor串

$str = addslashes("WYNN'S"); 

的特殊字符,然后传递给SQL查询。

0

你应该,如果你使用的是的mysqli extention逃避特殊字符在SQL语句中

,使用的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 extention,使用PDO ::报价PDO准备

,如果您使用的是过时的mysql扩展,可以使用mysql的实时逃逸字符串

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'"; 
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的方法,你可以让使用->prepare()->bindValue()