所以,我正在使用PHP并准备发送到MySQL数据库的语句。我遇到了一个我无法调试的问题。这是我的代码:
// Check if the input username is in the database
$stmtQuery = "SELECT * FROM updatedplayers WHERE Player=?;";
$preparedStmt = $dbc->prepare($stmtQuery);
$preparedStmt->bind_param("s", $setUsername);
$preparedStmt->execute();
$preparedStmt->bind_result($resultUUID, $resultUsername);
$preparedStmt->fetch();
// If it's not, kill the page.
if ($resultUUID == null) {
incorrect();
}
$stmtQuery = "SELECT Password, Salt FROM logins WHERE UUID=?;";
echo 'flag1 ';
$preparedStmt = $dbc->prepare($stmtQuery);
echo 'flag2 ';
$preparedStmt->bind_param("s", $resultUUID);
echo 'flag3 ';
第一个准备好的陈述工作正常,它在$preparedStmt->bind_param("s", $resultUUID);
行。在这之前还有其他几个准备好的陈述,所以我知道我正确地做了这个,但我对最后的陈述不太确定。
代码似乎在echo 'flag2 ';
之后停止运行,我在那里找到了特定的行。我没有收到任何错误消息,它只打印出flag3
我尝试用静态字符串替换$resultUUID
,但我得到了相同的结果。另外,我知道我的SQL语句格式正确,我已经在控制台中手动测试了。
这就是它,我很想听到一些批评,因为我不熟悉PHP。另外,有没有办法更好地了解我得到的错误,而不是试图自己查明错误?谢谢!
答案 0 :(得分:1)
所以,@ user2182349建议添加ini_set('display_error', 1);
给了我更多的洞察力,我得到了"致命错误:在布尔值"上调用成员函数bind_param() / em>的。
在some research之后,我尝试添加mysqli_report(MYSQLI_REPORT_ALL);
,最终抛出"在查询/预备语句" 中没有使用索引。
我做了some research就知道这不是问题,只是MySQLI报告了不必要的错误( 我要求它做的事情lol)。为了获得更好,更有见地的堆栈跟踪,我使用了mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
。
这使得"命令不同步;你现在不能运行这个命令" 。同样,more research教会我使用$preparedStmt->store_result();
,以便允许另一个准备好的陈述运行。
非常感谢所有人和所有人。帮助,希望这也可以帮助别人。
答案 1 :(得分:0)
您应该能够使用与此类似的单个select语句:
def firstUniqChar(word):
for i in range(0,len(word)): ## iterate through the string
if not word[i] in word[i+1:len(word)]: ## check if the rest contains that char
index=i
break
return index
检查字段名称是否与数据库匹配。
在文件顶部添加 ini_set('display_errors',1); 。如果您有任何PHP错误,将显示它们。还要检查数据库调用的返回值,并使用错误显示函数。
答案 2 :(得分:-1)
我建议你应该开始使用PDO ......几年前我遇到了mysqli准备好的声明。从那以后,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 ';
答案 3 :(得分:-1)
我认为在将变量用于另一个查询之前,您需要关闭预准备语句:
$preparedStmt->close();
或者使用其他变量名称$preparedStmt2
作为第二个查询。