【问题标题】:Escaping sigle quotes in a mysql query through php [duplicate]通过php在mysql查询中转义单引号[重复]
【发布时间】:2012-09-01 23:43:01
【问题描述】:

可能重复:
Mysql Real Escape String PHP Function Adding “\” to My Field Entry

所以这就是交易。我有一个本地服务器和一个远程服务器,它们都运行相同的 php 文件,该文件连接到 2 个相同的 mysql 数据库。在本地服务器上,命令

mysql_query("INSERT INTO eventtypes (name) VALUES ('".addslashes($_GET['name'])."')")

就像一个魅力,不插入斜线到字段中,只有 $_GET['name'] 的原始值。然而,在远程服务器上,斜线也被插入。我试过这些:

mysql_query("INSERT INTO eventtypes (name) VALUES ('".str_replace("'","''",$_GET['name'])."')

这个返回false,虽然当我在对应数据库的命令行上运行准确返回的字符串时,它正确地插入了适量的单引号,这很奇怪。

mysql_query("INSERT INTO eventtypes (name) VALUES ('".mysql_real_escape_string($_GET['name'])."')")

mysql_real_escape_string() 只在单引号中添加斜线,也像addslashes() 一样插入。

【问题讨论】:

  • 您不想在单引号中添加斜杠吗?我真的不明白你想做什么,你的标题在你说 mysql_real_escape_string 的最后声明“转义单引号”只添加到单引号。底线:不要使用 mysql_* 函数,因为它们已被弃用。

标签: php mysql quotes mysql-real-escape-string addslashes


【解决方案1】:

听起来您在远程服务器上启用了Magic Quotes。此功能导致您发现的不一致。把它关掉。

一旦你解决了这个问题,你正在尝试的三个方法中最好的方法是mysql_real_escape_string。但是,这是一种传统方法,不推荐使用。使用现代数据库库(如 mysqli 或 PDO)和绑定参数。另见Best way to prevent SQL Injection in PHP

【讨论】:

  • 谁反对这个?这是唯一真正回答问题的答案!即使使用 PDO,如果您不禁用魔术引号,您\ 插入数据库。
  • 虽然所有答案都有帮助,但这是我正在寻找的信息,上帝保佑你...
【解决方案2】:

停止使用mysql_query

Use PDO 和参数化查询。

$pdo = new PDO($dsn, $username, $password);
$statement = $pdo->prepare("INSERT INTO eventtypes (name) VALUES (:eventype)");
$statement->execute(array('eventtype' => $_GET['name']));

【讨论】:

  • 您意识到查询不起作用.. 对吗?删除 :eventype 上的单引号
  • 虽然这是个好建议,但这并不能解决问题中描述的数据中斜线不一致的问题。
  • ->execute() 调用仍然是错误的。对命名参数使用关联数组。 (到目前为止,我对这里的两个 PDO 答案都不满意。您的使用不需要的参数命名为一个值,而另一个更冗长的->bind_param(),确保新来者将继续避免使用 PDO更短的 mysql 方法。)
  • @mario 谢谢。有什么建议可以让 PDO 更易于解释吗?
【解决方案3】:

您的代码容易出现 SQL Injection。最好的方法是使用 PDOMYSQLI

使用 PDO 扩展的示例:

<?php

    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    $stmt = $dbh->prepare("INSERT INTO eventtypes (name) VALUES (?)");
    $stmt->bindParam(1, $_GET['name']);
    $stmt->execute();

?>

这将允许您使用单引号插入记录。

【讨论】:

  • 虽然这是个好建议,但这并不能解决问题中描述的数据中斜线不一致的问题。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多