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