-1

首先,我知道这不是它应该的样子。但是系统是这样设置的,所以我必须尝试使用​​它。

我在 mySQL 表中有一列条目,看起来像 {12}-{32} 等等。12是汽车品牌的id,32是车型。

现在我必须在 PHP 中创建一个查询,其中一部分是这样的: (PD1.fieldValue = '{". $_SESSION['carId'] ."}-{". $_SESSION['carModelId'] ."}'

你猜怎么着,这当然不适用于花括号。SESSION 部分完全是空的(是的,它们在查询之外有一个值)。

有没有办法解决这个问题,所以我仍然可以将大括号内的变量发送到 mySQL?

4

1 回答 1

3

每当您发现自己无法将某些字符输入数据库时​​,这强烈暗示您的数据库代码不安全且易受 SQL 注入攻击。你必须退后一步,看的更宽泛一些,思考“有哪些可能的字符没有被正确转义?” 幸运的是,您不必真正知道。您只需要使用内置的转义函数。

理想的解决方案是使用占位符。语法取决于您使用的数据库 API(mysqli 或 PDO;不推荐使用的 mysql 不支持它们)。有很多关于如何使用占位符的优秀资源;这是我从 Google 中提取的第一个结果,它看起来对我来说是正确的

不太理想的解决方案是将real_escape_string函数用于您的数据库 API。mysqli或的示例mysql

// Using heredoc syntax, you can clean up your queries like so.
$sql_template = <<<SQL
  SELECT
    PC.id AS cId,
    P.id AS pId
  FROM PAGE_CATALOG P
    LEFT JOIN PAGE_CATALOG_CONFIG PC ON (PC.id = P.cId)
  WHERE PD1.fieldValue = '%s'
    AND P.productCode REGEXP '%s'
    AND PC.id = '1'
    AND P.enabled = '1'
  GROUP BY P.id
  ORDER BY P.productVolgorde ASC
  LIMIT 0, 10
SQL;

// For mysqli:
// $mysqli = new mysqli(...)
$sql = sprintf(
  $sql_template,
  $mysqli->real_escape_string('{' . $_SESSION['carId'] . '}-{' . $_SESSION['carModelId'] . '}'),
  $mysqli->real_escape_string($MAL_TYPE)
);
$result = $mysqli->query($sql);
// For mysql:
$sql = sprintf(
  $sql_template,
  mysql_real_escape_string('{' . $_SESSION['carId'] . '}-{' . $_SESSION['carModelId'] . '}'),
  mysql_real_escape_string($MAL_TYPE)
);
$result = mysql_query($sql);
于 2014-10-03T14:23:23.753 回答