当我尝试通过PHP将记录插入mysql时,我遇到了一个非常奇怪的问题,我想知道是否有人可以对它进行任何解释,因为我现在已经没有想法了。
数据库表:
Field Type Null Default Comments
UserID bigint(20) No Autoincrement
UserGUID text No
ServerID int(11) No
UserName text No
Passwrd text No
Prompt text No
Answer text No
EMail text No
Verified int(11) No 0
Language text No
Gender int(1) Yes NULL
DateOfBirth int(11) Yes NULL
Country int(11) Yes NULL
PostCode text Yes NULL
State text Yes NULL
Town text Yes NULL
相关PHP代码的Snippit ......
public function signupUser($uid, $pwd, $prompt, $answer, $email, $lang, ... &$result)
{
$guid = $this->getGUID();
$serverID = 1;
$result = mysql_query("INSERT INTO User(UserGUID, ServerID, UserName, Passwrd, EMail) " +
"VALUES ('$guid', $serverID, '$uid', '$pwd', '$email')");
在有人告诉我之前我应该使用mysqli,参数化查询等之前,请注意这个PHP / MySQL只是一个本地测试工具,在专用网络上,仅用于开发目的,直到真正的Web服务( dotNet / Oracle)可用。
因此,如果我使用合适的参数调用上面的函数,$ result将返回...
“您的SQL语法中有错误;请查看与您的MySQL服务器版本对应的手册,以便在第1行的”0“附近使用正确的语法”
但如果我将查询简化为......
$result = mysql_query("INSERT INTO User(UserGUID, ServerID, UserName, Passwrd) " +
"VALUES ('$guid', $serverID, '$uid', '$pwd')");
它有效!愉快地插入记录(尽管在非空字段中存在空值!?!)只是为了增加更多复杂性,如果我使用合适的值运行(原始)查询,例如
INSERT INTO User(UserGUID, ServerID, UserName, Passwrd, EMail) VALUES ('guid', serverID, 'uid', 'pwd', 'email')
通过phpMyAdmin直接对数据库,它也有效!!
这让我疯了。我已经尝试更改字段名称,可空性,顺序,我在查询中使用的字段(在前四个工作之后),值 - 没有一个有所作为。几乎看起来好像它不想要超过四个字段。
请......任何人......?我真的很难理解为什么它不会接受第五个领域,我看不出任何意义。不幸的是,返回的错误根本没有任何帮助,太模糊,似乎相当于MS发生的那么有用的“错误”。
如果我必须转换到mysqli,我会,但如果我可以避免,我宁愿不必重新制作测试工具。
答案 0 :(得分:1)
在过去我遇到了与此类似的奇怪问题 - 并且能够通过将我的表格和列名称封装在反引号columnX
,columnY
中来解决它 - 我也会尝试添加空格表名'User'和包含SQL语法
mysql_query("INSERT INTO User(UserGUID, ServerID, UserName, Passwrd, EMail) " +
"VALUES ('$guid', $serverID, '$uid', '$pwd', '$email')");
看看this question?非常类似于你的成功结果
希望我能得到一些帮助答案 1 :(得分:0)
如果你的例子是文字,我怀疑是否有效。字符串连接运算符是“。”在PHP中不是“+”。另外,php不会解释单引号内的变量。尝试重写这样的查询:
$result = mysql_query("INSERT INTO User SET UserGUID = '" . $guid . "', ServerID = " . $serverID . ", UserName = '" . $uid . "', Passwrd = '" . $pwd . "'";
答案 2 :(得分:0)
我总是在字符串中创建SQL,如果有问题,我会插入echo $sql
或error_log($sql)
语句。
有时会有一些非常微妙的东西。将查询从调试输出复制并粘贴到phpMyAdmin时,您将看到更有意义的错误消息。
有一点可能是变量$email
包含突破字符串的内容。确保在将PBP变量包含在SQL查询中之前使用mysql_real_escape_string
。