mysqli_query 通过变量输入

Posted

技术标签:

【中文标题】mysqli_query 通过变量输入【英文标题】:mysqli_query inputs via variable 【发布时间】:2013-03-16 14:14:09 【问题描述】:

我正在尝试使用以下 php 代码向 mysql 表添加信息。 (从 html5 基本 Web 表单中输入名称和文本。)可能是语法问题?

<?php
include "dbinfo.php"; //contains mysqli_connect information (the $mysqli variable)
//inputs
$name = $_GET["name"];
$text = $_GET["text"];

$sqlqr = 'INSERT INTO `ncool`.`coolbits_table` (`name`, `text`, `date`) VALUES ("$name", "$text", CURRENT_TIMESTAMP);'; //the query. I'm pretty sure that the problem is a syntax one, and is here somewhere.

mysqli_query($mysqli,$sqlqr); //function where the magic happens.
?>

没有抛出错误。结果是一个空白屏幕,并且将带有“$name”和“$text”的行添加到 MySQL 表中。

【问题讨论】:

警告!您的代码很容易受到 SQL 注入攻击。阅读有关如何转义 SQL 变量的信息,最好使用准备好的语句。 根据发布的代码,插入的行和空白屏幕正是我所期望的。 mysqli_error() 返回什么? @EdGibbs 是的,但是添加的是变量名(字面意思是 $name),而不是它的值。 @Jocelyn mysqli_error() 不返回任何内容(假设我使用正确)。 【参考方案1】:

您的代码应该是这样的(添加了 SQL 注入保护):

<?php
include "dbinfo.php"; //contains mysqli_connect information (the $mysqli variable)
//inputs
$name = mysqli_real_escape_string($_GET['name']);
$text = mysqli_real_escape_string($_GET['text']);

$sqlqr = "INSERT INTO `ncool`.`coolbits_table` (`name`, `text`, `date`) VALUES ('" . $name . "', '" . $text . "', CURRENT_TIMESTAMP);";

mysqli_query($mysqli,$sqlqr); //function where the magic happens.
?>

看看我做了什么。首先,我已将您正在检索的用户输入转义到 $name$text 变量中(出于安全原因,这几乎是必须的),并且正如其他人建议的那样,您最好使用准备好的语句。

问题是您没有用单引号 (') 包围字符串值,这是 SQL 语法的要求。

我希望这有助于回答您的问题。

【讨论】:

谢谢。这似乎给出了一些错误(在 $sqlqr 行和输入中),但我很确定我知道那里发生了什么并将修复它。 @EM-Creations 你需要修正单引号和双引号。 程序 mysqli_real_escape_string() 有两个参数:要转义的字符串和 $link 变量。 php.net/manual/en/mysqli.real-escape-string.php 如果我使用 VALUES ('$name ', ' $text ', CURRENT_TIMESTAMP) 而不是 VALUES ('" . $name . "', '" . $text . "' , CURRENT_TIMESTAMP) ?如果是,那你能解释一下原因吗?【参考方案2】:

首先:你应该使用mysqli准备好的语句来防止SQL注入攻击。 在没有适当转义的情况下在查询中使用用户输入是不安全的。准备好的语句有助于防止这种情况发生。

第二:你应该了解字符串引用在PHP中是如何工作的,单引号字符串和双引号字符串是不同的

我建议阅读PHP documentation 关于字符串引用。

【讨论】:

将查看并阅读它。我以为我已经读得够透彻了,但我想我需要再看一遍。【参考方案3】:
   $sqlqr = 'INSERT INTO `ncool`.`coolbits_table` (`name`, `text`, `date`) VALUES ("'.$name.'", "'.$text.'", CURRENT_TIMESTAMP)';

将变量放在引号之外。

【讨论】:

以上是关于mysqli_query 通过变量输入的主要内容,如果未能解决你的问题,请参考以下文章

得到通知是未定义的变量 $con 和警告 mysqli_query 期望参数 1 是 mysqli

尝试将 xampp 数据库表连接到 php:错误未定义变量:mysqli_query 和致命错误

让 mysqli_query 执行的问题

将数据库中的计数作为变量返回到 PHP [重复]

如何将数组存储到php中的会话变量中

如何在php中将json数组值声明为变量