我应该如何解释$ stmt-> execute();的null结果?

时间:2018-04-23 16:03:01

标签: php debugging

我运行最近有效的查询,然后对数据库进行了更改,我必须更新准备好的语句。

此外,我使用日志功能来跟踪正在进行的操作。

我执行的指示是:<​​/ p>

...
$result = $stmt->execute();
my_log("[Database.php].[insertPlayerDevice] SQL prepared statement result: " . $result);

日志功能的结果(仅参见中间行)是:

[2018-04-23 05:04:23] [Database.php].[insertPlayerDevice] FacePngBase64: ./images/faces/x9oijohlfzeesj6apjqshokfn0eyad2y.png
[2018-04-23 05:04:23] [Database.php].[insertPlayerDevice] SQL prepared statement result: 
[2018-04-23 05:04:23] [Database.php].[storePost] Saving the images.

显然它是空的,我不明白为什么。它应该是真的还是假的。不错吗?

除其他外,所有以前的查询(除了我发布的查询之外还有许多其他x)工作和更新数据库,但不是这样。

我想了解错误是什么以及它在哪里。找出哪个查询不起作用仍然是一个好点。

在任何情况下,问题都是一样的:为什么该语句($stmt->execute();)返回null?

  

更新我在这里发布完整功能:   正如ibrahim-hafiji所述,我发布了以下全部功能:

public function insertPlayerDevice($UidDevice, $Action, $Locale, $Language, $Name, $Age, $Sex, $Avatar, $Costume, $Level, $MovementsPoints, $Score, $CardPngBase64, $FacePngBase64)
{
    my_log("[Database.php].[insertPlayerDevice] Adding info to the PlayerDevice table.");
    my_log("[Database.php].[insertPlayerDevice] Adding following fields:");
    my_log("[Database.php].[insertPlayerDevice] UidDevice: " . $UidDevice);
    my_log("[Database.php].[insertPlayerDevice] Action: " . $Action);
    my_log("[Database.php].[insertPlayerDevice] Locale: " . $Locale);
    my_log("[Database.php].[insertPlayerDevice] Language: " . $Language);
    my_log("[Database.php].[insertPlayerDevice] Name: " . $Name);
    my_log("[Database.php].[insertPlayerDevice] Age: " . $Age);
    my_log("[Database.php].[insertPlayerDevice] Sex: " . $Sex);
    my_log("[Database.php].[insertPlayerDevice] Avatar: " . $Avatar);
    my_log("[Database.php].[insertPlayerDevice] Costume: " . $Costume);
    my_log("[Database.php].[insertPlayerDevice] Level: " . $Level);
    my_log("[Database.php].[insertPlayerDevice] Score: " . $Score);
    my_log("[Database.php].[insertPlayerDevice] CardPngBase64: " . $CardPngBase64);
    my_log("[Database.php].[insertPlayerDevice] FacePngBase64: " . $FacePngBase64);
    $sql = "INSERT INTO PlayerDevice(UidDevice, Action, Locale, Language, Name, Age, Sex, Avatar, Costume, Level, MovementsPoints, Score, CardPngBase64, FacePngBase64) VALUES (:UidDevice, :Action, :Locale, :Language, :Name, :Age, :Sex, :Avatar, :Costume, :Level, :MovementsPoints, :Score, :CardPngBase64, :FacePngBase64)";
    $stmt = $this->PDO->prepare($sql);
    $stmt->bindParam(':UidDevice',$UidDevice , PDO::PARAM_STR);
    $stmt->bindParam(':Action',$Action , PDO::PARAM_STR);
    $stmt->bindParam(':Locale',$Locale , PDO::PARAM_STR);
    $stmt->bindParam(':Language',$Language , PDO::PARAM_STR);
    $stmt->bindParam(':Name',$Name , PDO::PARAM_STR);
    $stmt->bindParam(':Age',$Age , PDO::PARAM_INT);
    $stmt->bindParam(':Sex',$Sex , PDO::PARAM_STR);
    $stmt->bindParam(':Avatar',$Avatar , PDO::PARAM_INT);
    $stmt->bindParam(':Costume',$Costume , PDO::PARAM_INT);
    $stmt->bindParam(':Level',$Level , PDO::PARAM_INT);
    $stmt->bindParam(':MovementsPoints',$MovementsPoints , PDO::PARAM_INT);
    $stmt->bindParam(':Score',$Score , PDO::PARAM_INT);
    $stmt->bindParam(':CardPngBase64',$CardPngBase64 , PDO::PARAM_STR);
    $stmt->bindParam(':FacePngBase64',$FacePngBase64 , PDO::PARAM_STR);
    $result = $stmt->execute();
    my_log("[Database.php].[insertPlayerDevice] SQL prepared statement result: " . $result);

}

但是,我想指出在更改数据库之前的这个查询是否正常工作。

  

问题解决了:

我感谢大家的建议和帮助。

我在这里直接总结了能够帮助那些可能遇到同样问题的人对我有多大帮助。

我的错误是我假设在日志文件中打印falsetrue,但如果为false,则返回空字符串。 PHP就是这样。

要查找准备好的语句错误,您可以使用$ result-> errorInfo ();,如下面的代码所示:

    $stmt->execute();
    $result = $stmt->errorInfo();
    ob_start();
    var_dump($result);
    my_log("[Database.php].[insertPlayerDevice] SQL prepared statement result: " .ob_get_clean());

多亏了这一点,我立即发现了数据库中的错误:

[2018-04-23 06:04:44] [Database.php].[insertPlayerDevice] SQL prepared statement result: array(3) {
  [0]=>
  string(5) "42S22"
  [1]=>
  int(1054)
  [2]=>
  string(36) "Unknown column 'Sex' in 'field list'"
}

1 个答案:

答案 0 :(得分:1)

不是

execute返回布尔值,在你的情况下它将是falsefalse转换为字符串给出空字符串。这就是“结果:”之后的原因。

要获得更易读的输出,您可以将日志行替换为

my_log("[Database.php].[insertPlayerDevice] SQL prepared statement result: " . ($result?"true":"false"));

要检查它失败的原因errorInfo