0

在尝试通过 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代码的片段......

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,我会,但如果可以避免的话,我宁愿不必重新制作测试工具。

4

3 回答 3

1

启示后编辑:看看评论中的连接运算符在 php 中绝对是一个 . 不是+,我会把钱放在那里,这是你的问题……我第一次看时甚至都没有看到。

在过去,我遇到了与此有些相似的奇怪麻烦-并且能够通过将我的表名和列名封装在反引号中来解决它 columnXcolumnY-我还会尝试在表名“用户”和包含您的列的括号之间添加一个空格SQL 语法中的名称

mysql_query("INSERT INTO User(UserGUID, ServerID, UserName, Passwrd, EMail) " + 
                               "VALUES ('$guid', $serverID, '$uid', '$pwd', '$email')");

看看这个问题?与您的非常相似,并取得了成功

希望我能提供一些帮助

于 2013-05-19T02:04:23.940 回答
0

如果你的例子是字面的,我怀疑两者都行得通。字符串连接运算符是“。” 不是 php 中的“+”。此外,php 不会解释单引号内的变量。尝试像这样重写查询:

$result = mysql_query("INSERT INTO User SET UserGUID = '" . $guid . "', ServerID = " . $serverID . ", UserName = '" . $uid . "', Passwrd = '" . $pwd . "'";
于 2013-05-19T02:12:28.700 回答
0

我总是在字符串中创建 SQL,如果有问题,我会插入一个echo $sqlorerror_log($sql)语句。

有时有一些非常微妙的东西。当您将调试输出中的查询复制并粘贴到 phpMyAdmin 中时,您将看到更有意义的错误消息。

一件事可能是变量$email包含从字符串中分离出来的东西。在将它们包含在 SQL 查询中之前,请确保mysql_real_escape_string在 PBP 变量上使用它们。

于 2013-05-19T02:17:08.180 回答