PHP - 准备好的语句查询第二次不起作用

时间:2016-09-23 01:47:56

标签: php mysql prepared-statement

所以,我正在使用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。另外,有没有办法更好地了解我得到的错误,而不是试图自己查明错误?谢谢!

4 个答案:

答案 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作为第二个查询。