【发布时间】:2012-05-01 19:29:31
【问题描述】:
我知道我们可以在 Javascript 中的字符串之间插入一个函数,所以 PHP 也应该可以。
Javascript:
var myString = "aString " + function_returning_string() + " anotherString";
PHP:可以使用 sprintf 完成,如本页示例 http://fr.php.net/mysql_real_escape_string
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
效果很好,但我想知道为什么当我们像这样直接将所有内容放在字符串中时它不起作用:
$query = "SELECT * FROM users WHERE user='".mysql_real_escape_string($user)."' AND password='".mysql_real_escape_string($password)."'";
我们怎样才能做到这一点?
在一些答案之后,我意识到问题与嵌入在字符串中的函数无关,因为其他函数正在工作,所以它显然是 mysql_real_escape_string (deprecated) 函数。
当我将结果保存在变量中然后将其插入字符串时,此功能也不起作用。
这是我完整的 php 文件,在 Firebug 控制台中没有修改 500 Internal Server Error:
<?php
/*ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);
require_once('/var/www/FirePHPCore/FirePHP.class.php');
ob_start();
$firephp = FirePHP::getInstance(true);*/
$reference = $_POST['reference'];
$txtGauche = $_POST['motGauche'];
$txtDroite = $_POST['motDroite'];
$ptGauche = $_POST['repGauche'];
$ptDroite = $_POST['repDroite'];
$base = mysql_connect("localhost","root","root");
$sql_utf8 = "SET NAMES utf8;";
$sql_base = "CREATE DATABASE IF NOT EXISTS elan
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;";
$sql_table = "CREATE TABLE IF NOT EXISTS relier_points (
`Reference` VARCHAR(20),
`TexteGauche` VARCHAR(500),
`TexteDroite` VARCHAR(500),
`ReponseGauche` VARCHAR(300),
`ReponseDroite` VARCHAR(300));";
/*$sql_insert = sprintf("INSERT INTO relier_points VALUES('%s','%s','%s','%s','%s')",
mysql_real_escape_string($reference),
mysql_real_escape_string($txtGauche),
mysql_real_escape_string($txtDroite),
mysql_real_escape_string($ptGauche),
mysql_real_escape_string($ptDroite));*/
$reference = mysql_real_escape_string($reference);
$txtGauche = mysql_real_escape_string($txtGauche);
$txtDroite = mysql_real_escape_string($txtDroite);
$ptGauche = mysql_real_escape_string($ptGauche);
$ptDroite = mysql_real_escape_string($ptDroite);
$sql_insert = "INSERT INTO relier_points VALUES('$reference','$txtGauche','$txtDroite','$ptGauche','$ptDroite')");
mysql_query($sql_utf8,$base);
mysql_query($sql_base,$base);
mysql_select_db("elan",$base);
mysql_query($sql_table,$base);
$result = mysql_query($sql_insert,$base);
//$firephp->log($result, 'test');
mysql_close($base);
if($result == TRUE)
echo "Exercice $reference reçu";
else
var_dump($result);
?>
哦,对不起,我昨天累了。万一你没有注意到,我在直接转换字符串中的 $sql_insert 时忘记从 sprintf 中删除最后一个“)”。
顺便说一句,它现在可以在没有变量的情况下工作:
$sql_insert = "INSERT INTO relier_points VALUES('"
.mysql_real_escape_string($reference)."','"
.mysql_real_escape_string($txtGauche)."','"
.mysql_real_escape_string($txtDroite)."','"
.mysql_real_escape_string($ptGauche)."','"
.mysql_real_escape_string($ptDroite)."')";
所以这是一个笨拙的错误,但至少我知道我应该使用 PDO 或 MySQLi 而不是 mysql_ 函数:)
【问题讨论】:
-
第二个例子有什么错误?
-
当你这样做时会发生什么?它与你所希望的有什么不同? (当问技术问题时,“它不起作用”几乎总是说错话。要具体!)
-
第二个 PHP 示例对我来说很好用。 codepad.org/NwEvj5Np
-
请停止使用古老的
mysql_*函数编写新代码。它们不再维护,社区已经开始 deprecation process 。相反,您应该了解prepared statements 并使用PDO 或MySQLi。如果你想学习,here is a quite good PDO-related tutorial. -
没有。程序风格也不错。 mysql_real_escape_string 未被弃用。人们毫无头绪。这个函数的mysqli_版本不应该和mysql_一样直接在代码中使用。必须间接使用它,作为查询构建工具的一部分。否则将允许注射。 PDO::quote() 更好,因为它确实转义和添加引号。