2

我有这样的代码和平:

$result = mysql_query("SELECT * FROM T_utilisateur WHERE cin = '" . $_POST['cin'] . "', AND pwd = '" . $_POST['pwd'] . "'");

我的问题是:有什么方法可以mysql_query()简单地在函数中写入字符串,因为有时我有很多变量必须与字符串连接。

例如,在 C# 中,我使用 String.Format 如下:这是一种简单的方法,因为如果我使用 concatString.Format("SELECT * FROM T_utilisateur WHERE cin = '{0}', AND pwd = '{1}'", cin, pwd);有时我会忘记字符'.

4

5 回答 5

4

使用准备好的语句。它们是为此目的而设计的。此外,您应该注意,以您实际执行的方式构建 SQL 查询容易受到 SQL 注入的攻击。或者换句话说,这是易受攻击代码的最佳示例。如果黑客发布 SQL 语句怎么办?准备好的语句将防止这种情况发生,因为它将查询数据与查询语法分开。

在 PHP 中,您可以使用PDO准备好的 statemtens(以及其他扩展)。这里有一个简短的例子:

$pdo = new PDO('...');

$stmt = $pdo->prepare('SELECT FROM table WHERE id=:id AND title=:title ...');
$stmt->execute(array('id' => 1, 'title' => 'test'));

更新:

在评论中你说你必须使用 mysql_* 扩展。如果这样做,您应该知道,您必须转义每个值以防止 SQL 注入。像这样:

 // first(!!!) connect to mysql. this is important because
 // mysql_real_escape_string() will need information about
 // the current connection's encoding to work properly
 if(!mysql_connect(...) && mysql_select_db(...)) {
     die('mysql connection error');
 }

 // escape values
 $id    = mysql_real_escape_string($_POST['id']);
 $title = mysql_real_escape_string($_POST['title']);
 ...

 // now you could just use double quotes `"` to insert vars into the query string:
 mysql_query("SELECT * FROM `table` WHERE id = $id AND title = '$title'");

如果您需要此附加信息:

注意:有一种称为curly 语法的语法{},可用于访问双引号"字符串中的数组。我没有在示例中使用它,因为不建议将 post vars 放在查询中而不先转义它们。然而,这里有一个语法示例:

$array = array('foo' => 'bar');
$string = "Hello {$array['foo']}";
于 2013-04-21T16:17:31.420 回答
2

如果你使用双引号,任何以 开头的变量$都将由 php.ini 自动填充。不确定它是否也适用于$_POST变量。

例如:

$result = mysql_query("SELECT * FROM T_utilisateur WHERE cin = $cin AND pwd = $pwd");
于 2013-04-21T16:18:50.613 回答
1

当您在 SQL 查询中使用任何用户提供的值时,您就会面临 SQL 注入。因此,您必须小心并适当地处理用户提供的数据。最好是在您的情况下使用 PHP 的 PDO 进行数据库访问。这也将回答您的问题。

这里有一些关于这个主题的好文章:

请注意,不推荐使用 mysql_real_escape_string。

来自php 文档

从 开始,此扩展程序已弃用PHP 5.5.0,并将在将来删除。相反,应该使用MySQLior扩展名。PDO_MySQL另请参阅MySQL: choosing an API guide and related FAQ以获取更多信息。此功能的替代方案包括:

于 2013-04-21T16:23:05.287 回答
0

PHP 有一个sprintf()函数,但您应该使用准备好的查询语句

$result = mysql_query(sprintf(
  "SELECT * FROM `T_utilisateur` WHERE `cin`='%s' AND `pwd`='%s'", 
  $_POST['cin'], $_POST['pwd']
));
于 2013-04-21T16:22:47.133 回答
0

如果您想以不安全的方式进行操作,我会说sprintf() 。但老实说,正如 hek2mgl 建议的那样,使用准备好的语句

于 2013-04-21T16:23:31.060 回答