为啥这个简单的“INSERT INTO”查询不起作用

Posted

技术标签:

【中文标题】为啥这个简单的“INSERT INTO”查询不起作用【英文标题】:Why wont this simpy "INSERT INTO" query work为什么这个简单的“INSERT INTO”查询不起作用 【发布时间】:2014-03-31 20:11:13 【问题描述】:

我正在为您通过表单注册的学校项目创建一个简单的注册和登录系统。

这是我的注册过程代码(没有确定字段是否为空等的一堆测试),这只是查询部分。

很抱歉包含丹麦符号 (ÆØÅ) 的变量,并且是丹麦语,但我已经做了几个测试,如果我使用 æøå 或其他类型的字母并不重要。

我简直无法理解为什么这段小代码不起作用:

//I retrieve alot of variables from a form

 $Fornavn = mysql_real_escape_string($_POST["Fornavn"]); 
 $Efternavn = mysql_real_escape_string($_POST["Efternavn"]); 
 $Koen = mysql_real_escape_string($_POST["Koen"]); 
 $Etnicitet = mysql_real_escape_string($_POST["Etnicitet"]); 
 $Brugernavn = mysql_real_escape_string($_POST["Brugernavn"]);
 $Password = mysql_real_escape_string($_POST["Password"]);
 $Mail = mysql_real_escape_string($_POST["Mail"]);
 $Haarfarve = mysql_real_escape_string($_POST["Haarfarve"]);
 $Oejenfarve = mysql_real_escape_string($_POST["Oejenfarve"]);
 $Vaegt = mysql_real_escape_string($_POST["Vaegt"]);
 $Hoejde = mysql_real_escape_string($_POST["Hoejde"]);

     //The query 

 mysqli_query($con, "INSERT INTO bruger (Fornavn, Efternavn, Køn, Etnicitet, Brugernavn, Password, Mail, Hårfarve, Øjenfarve, Vaegt, Højde)
VALUES ('$Fornavn', '$Efternavn', '$Koen', '$Etnicitet', '$Brugernavn', '$Password',     '$Mail', '$Haarfarve', '$Oejenfarve', '$Vaegt', '$Hoejde')");
echo $Fornavn;

编辑: 我知道它不起作用,因为在我运行代码后,我的 mysql 数据库中没有出现任何内容。 它只返回零行(我使用 phpmyadmin 顺便说一句。)而且我并没有真正收到任何错误消息或任何东西。

按照建议,我尝试将 Mysqli_* 用于我的变量:

 //I retrieve alot of variables from a form
 $Fornavn = mysqli_real_escape_string($con,$_POST["Fornavn"]); 
 $Efternavn = mysqli_real_escape_string($con,$_POST["Efternavn"]); 
 $Koen = mysqli_real_escape_string($con,$_POST["Koen"]); 
 $Etnicitet = mysqli_real_escape_string($con,$_POST["Etnicitet"]); 
 $Brugernavn = mysqli_real_escape_string($con,$_POST["Brugernavn"]);
 $Password = mysqli_real_escape_string($con,$_POST["Password"]);
 $Mail = mysqli_real_escape_string($con,$_POST["Mail"]);
 $Haarfarve = mysqli_real_escape_string($con,$_POST["Haarfarve"]);
 $Oejenfarve = mysqli_real_escape_string($con,$_POST["Oejenfarve"]);
 $Vaegt = mysqli_real_escape_string($con,$_POST["Vaegt"]);
 $Hoejde = mysqli_real_escape_string($con,$_POST["Hoejde"]);

 //The query
   mysqli_query($con, "INSERT INTO bruger (Fornavn, Efternavn, Køn, Etnicitet, Brugernavn,   Password, Mail, Hårfarve, Øjenfarve, Vaegt, Højde)
   VALUES ('$Fornavn', '$Efternavn', '$Koen', '$Etnicitet', '$Brugernavn', '$Password',    '$Mail', '$Haarfarve', '$Oejenfarve', '$Vaegt', '$Hoejde')");
   echo $Fornavn;

但它不起作用。

所有内容都以“Varchar”的形式存储在数据库中,排序规则为“utf8_danish_ci”。

对cmets的回答:

@John @Jayaram 我没有检索到任何错误消息,或者我不知道它们去了哪里?我对 Mysql 和 PHP 真的很陌生。

@Adunahay Vaegt 和 Højde 在表中存储为 Varchar。

@Gordon 连接代码如下:

//We check the connection 
$con = mysqli_connect("localhost","Mads","","meat-market");
//If there is a fail. 
if (mysqli_connect_errno()) 
     
    echo "<h1> Det er vores fejl:</h1><br /><h2>Kunne ikke forbinde til Databasen:</h2><br /> " . mysqli_connect_error();
    exit;
    

尽管我确定表存在并且数据库确实存在,因为我可以在 Phpmyadmin 中看到它。用户 Mads 还拥有所有必要的权限。

@Raphaël 我不知道你是否可以使用特殊字符,但在我尝试使用特殊字符之前我已经进行了几次测试,它似乎工作正常。

@dboals 我不知道你的意思(我是 php 新手),欢迎进一步解释。

【问题讨论】:

你怎么知道它不起作用?你有错误吗?错误信息是什么? VaegtHøjde 是否以整数形式存储在数据库中?如果是这样,你在这里传递字符串。 您收到的错误信息是什么? 也许很愚蠢,但你能在列名中使用“特殊字符”而不用反引号吗? 建议将您的查询字符串放入 $query_string 之类的变量中并打印出来,然后使用 phpmyadmin 或直接 mysql 命令行,看看您的查询字符串是否有效。 【参考方案1】:

这是因为您使用 mysql_* 作为 POST 变量,mysqli_* 作为数据库连接,并且在查询中使用 $con 作为第一个变量,即 mysqli_* 语法。

变化:

$Fornavn = mysql_real_escape_string($_POST["Fornavn"]); 

$Fornavn = mysqli_real_escape_string($con,$_POST["Fornavn"]);

对其他人也这样做。

旁注:将所有 mysqli_* 函数专门用于您的整个代码 --- mysqli_*mysql_* 函数不要混合在一起..(我建议您与 prepared statementsPDO 一起使用)

mysqli_ 的准备和绑定示例可以在 HERE 找到。

【讨论】:

我用我的一个测试表对其进行了测试,并添加了一个名为“Hårfarve”的列,输入的数据为“Hårfarve_123”,效果很好。我的表格的排序规则设置为“latin1_general_ci”@NotaBird 您还可以发布您正在使用的 html 表单吗? 您可以尝试的另一件事是将 $con-&gt;set_charset("utf8"); 放在您的 INSERT mysqli_query($con, "INSERT 之前,以在您的数据库连接代码之后读取为 $con-&gt;set_charset("utf8"); mysqli_query($con, "INSERT... @NotaBird 或 mysqli_set_charset($con, 'utf8'); 对于错误报告,请尝试将mysqli_report(MYSQLI_REPORT_STRICT);mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 放在您的数据库连接@NotaBird 之前【参考方案2】:

我发现出了什么问题。 首先,我需要在我的变量中将 mysql_* 更改为 mysqli_*。

但在那之后它仍然没有工作。

然后我尝试将字母“æ ø å”更改为数据库中不是特殊字母的内容。

变量名似乎并不重要。

所以改为:

Æ = AE Ø = OE Å = AA

所以显然特殊字符是不行的,尽管它似乎有点不一致,因为我以前用特殊字符做过......我不知道它是否依赖于数据库的排序......

但是感谢大家!

编辑!:

我在我的表和所有行中使用 UTF8_Danish_ci 排序规则。

但是在这之后我仍然有一个问题,如果我在表单中输入一个特殊字符,它会显示为 A|或数据库中的类似内容。

我已通过对来自表单的每个变量执行以下操作来解决此问题:

 $Fornavn =utf8_decode($_POST["Fornavn"]);
 $Fornavn = mysqli_real_escape_string($con,$Fornavn); 

并将以下参数添加到我的 FORM 标记中:

accept-charset="UTF-8"

仍然无法执行行名包含 Æ Ø 或 Å 的 mysqli 查询。

【讨论】:

以上是关于为啥这个简单的“INSERT INTO”查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

INSERT INTO with CURSOR 在 TRIGGER 内

Insert Into 语句的语法错误

mysql 数据库乱码问题,页面,数据库都是UTF-8 的字符集,为啥INSERT INTO插入后会是乱码呢?

INSERT INTO 因 node-mysql 失败 - 变量始终为 NULL

[Mysql]备份同库中一张表的历史记录 insert into ..select

为啥会出现“INSERT INTO 语句中的语法错误”?