2016-09-23 70 views
0

因此,我正在使用PHP并准备好发送到MySQL数据库的语句。我遇到了一个我无法完全调试的问题。这里是我的代码:PHP - 准备好的语句查询第二次不起作用

 // Check if the input username is in the database 
 
\t \t $stmtQuery = "SELECT * FROM updatedplayers WHERE Player=?;"; 
 
\t \t $preparedStmt = $dbc->prepare($stmtQuery); 
 
\t \t $preparedStmt->bind_param("s", $setUsername); 
 

 
\t \t $preparedStmt->execute(); 
 
\t \t $preparedStmt->bind_result($resultUUID, $resultUsername); 
 
\t \t $preparedStmt->fetch(); 
 

 
\t \t // If it's not, kill the page. 
 
\t \t if ($resultUUID == null) { 
 

 
\t \t \t incorrect(); 
 
\t \t } 
 
\t \t 
 
\t \t $stmtQuery = "SELECT Password, Salt FROM logins WHERE UUID=?;"; 
 
\t \t echo 'flag1 '; 
 
\t \t $preparedStmt = $dbc->prepare($stmtQuery); 
 
\t \t echo 'flag2 '; 
 
\t \t $preparedStmt->bind_param("s", $resultUUID); 
 
\t \t echo 'flag3 ';

拳头准备好的语句工作正常,这是在该行$preparedStmt->bind_param("s", $resultUUID);。在这之前还有其他一些准备好的陈述,所以我知道我正确地做了这件事,但我不太清楚最后的陈述。

该代码似乎停止运行后echo 'flag2 ';,我放在那里找到具体的行。我没有收到任何错误消息,只是不打印出flag3
我试过用静态字符串代替$resultUUID,但我得到了相同的结果。另外,我知道我的SQL语句格式正确,我已经在控制台中手动进行了测试。

这是非常多的,我很想听到一些批评,因为我是PHP新手。另外,有什么方法可以更好地了解我所得到的错误,而不是试图自己查明错误吗?谢谢!

+0

'mysqli'驱动程序有错误报告功能,http://php.net/manual/en/mysqli.error.php。尝试在每个数据库交互中使用它。可能还想查看http://stackoverflow.com/questions/22662488/how-to-get-mysqli-error-in-different-environments以获取更多mysqli错误报告选项。 – chris85

+0

任何错误报告的运气? – chris85

+0

@ chris85我目前没有时间填写该表。我后天会有时间,然后我会回到你身边。 :) – Kaelinator

回答

1

所以,加入ini_set('display_error', 1);,由@ user2182349建议,给我多一点的洞察力,我“致命错误:调用布尔成员函数bind_param()”

some research之后,我尝试加入mysqli_report(MYSQLI_REPORT_ALL);,最后抛出“没有在查询/准备语句中使用索引”

我做了some research就知道这不是问题,只是MySQLI报告不必要的错误(其中是我要求它做的lol)。为了获得更好,更有洞察力的堆栈跟踪,我使用了mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

This throw “Commands out sync; you can not run this command now”。再次,more research教我使用$preparedStmt->store_result();,以便允许另一个准备好的语句运行。

非常感谢所有y'alls的帮助,希望这可以帮助别人。

-1

我建议你应该开始使用PDO ...我有几年前遇到的mysqli prepared声明中遇到的问题。从那时起,当涉及到多个查询时,PDO不会让我头疼。

你应该尝试PDO .. :-)它更有效率。

http://php.net/manual/en/intro.pdo.php http://php.net/manual/en/class.pdostatement.php

或者,您可以执行以下操作:“如果你想替代解决方案” ..

//Close connection 
$preparedStmt->close(); 

//AND OPEN YOUR CONNECTION AGAIN TO PREPARE NEW QUERIES.. 

$stmtQuery = "SELECT Password, Salt FROM logins WHERE UUID=?;"; 
echo 'flag1 '; 
$preparedStmt = $dbc->prepare($stmtQuery); 
echo 'flag2 '; 
$preparedStmt->bind_param("s", $resultUUID); 
echo 'flag3 '; 
+1

这并不回答这个问题,它是一种可能或不可行的替代方法。 – chris85

+0

尝试删除“;”在您的查询... – victor

+0

我编辑了我的答案在这里...为“替代解决方案” – victor

-1

我认为你需要使用变量另一个查询之前关闭准备好的声明:

$preparedStmt->close(); 

或使用其他变量名像$preparedStmt2第二查询。

+1

我知道这不是这种情况,因为我已经做了多个准备好的语句,而不必在每个语句之后关闭它。 :/ – Kaelinator

+0

根据本手册,http://php.net/manual/en/mysqli.quickstart.prepared-statements.php,请参见示例#3'多次执行',没有关闭。 – chris85

+0

@ chris85..INSERT与SELECT不同...我多次插入都没有问题..但是我遇到了困难选择多个时间....这就是为什么我转向使用PDO .. – victor

0

您应该能够使用类似一个SELECT语句:

SELECT u.UUID, u.Username, l.Password, l.Salt 
    FROM updatedplayers AS u 
    JOIN logins AS l ON (u.UUID = l.UUID) 
    WHERE u.Player = ? 

检查字段名的情况下,以确保他们的数据库匹配。

在文件的顶部,添加ini_set('display_errors',1);。如果您有任何PHP错误,它们将被显示。同时检查数据库调用的返回值并使用错误显示功能。

+0

谢谢,一旦我有机会,我会尝试这一点,我会回来与你。 – Kaelinator