Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用mysqli\u real\u escape\u字符串时,查询不会运行_Php_Mysqli - Fatal编程技术网

Php 使用mysqli\u real\u escape\u字符串时,查询不会运行

Php 使用mysqli\u real\u escape\u字符串时,查询不会运行,php,mysqli,Php,Mysqli,我正在将一个旧脚本转换为与MySQLi兼容,并遇到了一个问题 $link = mysqli_connect("localhost", "user", "password", "database"); if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $myQuery = "INSERT INTO table (name, desc

我正在将一个旧脚本转换为与MySQLi兼容,并遇到了一个问题

$link = mysqli_connect("localhost", "user", "password", "database");

if (mysqli_connect_errno()) {
     printf("Connect failed: %s\n", mysqli_connect_error());
     exit();
} 

$myQuery = "INSERT INTO table (name, description) VALUES ('$name', '$description')";

if (!mysqli_query($link, $myQuery)) {
    printf('Error');
} else {
    printf('Success');
}

mysqli_close($link);
这很好,没有错误。但是当我添加mysqli\u real\u escape\u string()时,我得到一个错误

$link = mysqli_connect("localhost", "user", "password", "database");

if (mysqli_connect_errno()) {
     printf("Connect failed: %s\n", mysqli_connect_error());
     exit();
} 

$myQuery = "INSERT INTO table (name, description) VALUES ('$name', '$description')";

$myQuery = mysqli_real_escape_string($link, $myQuery);

if (!mysqli_query($link, $myQuery)) {
    printf('Error');
} else {
    printf('Success');
}

mysqli_close($link);
这将返回一个错误:

您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 第1行“\'TestName\”附近的“\'TestDescription\”

我错过了一些简单的东西吗?引用

这一行:

$myQuery = mysqli_real_escape_string($link, $myQuery);
那是不对的

您需要使用
$name
变量,而不是
$myQuery
变量。这是需要转义的,而不是整个查询本身

$myQuery = mysqli_real_escape_string($link, $name);
但是,^
$myQuery
应替换为用于插入的每个变量

您的查询应该更像这样:

$name = "TestName";
$description = "TestDescription";

$name = mysqli_real_escape_string($link, $name);
$description = mysqli_real_escape_string($link, $description);

$myQuery = "INSERT INTO `table` (name, description) VALUES ('$name', '$description')";

if (!mysqli_query($link, $myQuery)) {
    printf('Error');
} else {
    printf('Success');
}

注:

你可能想研究一下如何使用,或者,它们更安全


另外,只是为了争论<代码>表是一个应为实际表名且需要转义的字符串:

$myQuery = "INSERT INTO `table`
  • 只是一种洞察力

mysqli
prepared语句示例:

$variable_1 = "Text";
$variable_2 = "More text";

$stmt = $link->prepare("INSERT INTO table_name 
                        (column_1, column_2) 
                        VALUES (?,?)");

$stmt->bind_param('ss', $variable_1, $variable_2);
$stmt->execute();
$dbh = new PDO('mysql:host=localhost;dbname=your_DB', $user, $pass);

$var_1 = "Text";
$var_2 = "More text";

$stmt = $dbh->prepare("INSERT INTO table_name 
                       (column_1, column_2) 
                       VALUES (:var_1,:var_2)");

$stmt->execute(array(':var_1' => $var_1, ':var_2' => $var_2));
  • 旁注:
    s
    用于字符串

PDO准备的语句示例:

$variable_1 = "Text";
$variable_2 = "More text";

$stmt = $link->prepare("INSERT INTO table_name 
                        (column_1, column_2) 
                        VALUES (?,?)");

$stmt->bind_param('ss', $variable_1, $variable_2);
$stmt->execute();
$dbh = new PDO('mysql:host=localhost;dbname=your_DB', $user, $pass);

$var_1 = "Text";
$var_2 = "More text";

$stmt = $dbh->prepare("INSERT INTO table_name 
                       (column_1, column_2) 
                       VALUES (:var_1,:var_2)");

$stmt->execute(array(':var_1' => $var_1, ':var_2' => $var_2));

mysqli\u real\u escape\u string
用于转义字符串值,而不是整个SQL查询。--请阅读参数绑定。在你弄明白为什么mysqli更努力之后,就切换到PDO。@mario只是一个简短的提示,以防你在发表评论后看到我的答案。这不是基于你在评论中发布的内容,因为我已经把它打印出来了。“这纯粹是巧合。”詹姆斯说。我不确定您是否看到了我的答案,但我已进行了编辑,您需要重新加载它,以便查看我修改的内容。我假设$name和$description都是在示例代码上方预设的。看起来都像是教程中的值和代码。@mario我也这么认为,但我想确认一下并让OP知道。