为何addkey方法已成功插入数据,对应的if条件仍返回false?
问题分析与解决方案
我一眼就瞅出问题所在了——你的addkey方法完全没在执行成功时返回true!
问题根源拆解
在PHP里,如果函数没有明确写return语句,默认会返回null。而布尔条件判断里,null会被直接当作false处理。这就导致哪怕数据已经成功写入数据库,你的if判断还是会走到else分支输出FALSE。
看看你的addkey方法代码:
public function addkey($key_value,$key_balance,$key_created_date){ if ( !$this->link ) return false; $query = "INSERT INTO `" . $this->table_prefix . "keys` (`key_value`,`key_balance`, `key_created_date`) VALUES('" . $this->realEscapeSingle($key_value) . "', '" . $this->realEscapeSingle((int)$key_balance) . "', '" . $this->realEscapeSingle($key_created_date) . "')"; ++$this->queries_; mysqli_query($this->link,$query); $key_id = mysqli_insert_id($this->link); if( !$key_id ) { echo mysqli_errno($this->link) . ": " . mysqli_error($this->link); return false; } // 这里!成功执行后没有任何返回语句! }
只有数据库连接失败、插入失败时,方法会返回false;但插入成功拿到有效$key_id后,方法啥也不返回,默认给个null,条件判断自然把它当成false了。
修复方法
只需要在方法最后加一行return true;就行:
public function addkey($key_value,$key_balance,$key_created_date){ if ( !$this->link ) return false; $query = "INSERT INTO `" . $this->table_prefix . "keys` (`key_value`,`key_balance`, `key_created_date`) VALUES('" . $this->realEscapeSingle($key_value) . "', '" . $this->realEscapeSingle((int)$key_balance) . "', '" . $this->realEscapeSingle($key_created_date) . "')"; ++$this->queries_; mysqli_query($this->link,$query); $key_id = mysqli_insert_id($this->link); if( !$key_id ) { echo mysqli_errno($this->link) . ": " . mysqli_error($this->link); return false; } // 新增成功后的返回语句 return true; }
额外优化建议
其实还可以加一步mysqli_query的结果校验,毕竟极端情况下可能出现查询执行失败但插入ID不为空的情况(虽然概率极低),优化后更稳妥:
// 执行查询并先检查执行结果 $result = mysqli_query($this->link,$query); if (!$result) { echo mysqli_errno($this->link) . ": " . mysqli_error($this->link); return false; } $key_id = mysqli_insert_id($this->link); if( !$key_id ) { echo "插入成功但未获取到自增ID"; return false; } return true;
内容的提问来源于stack exchange,提问作者Amin Hijaz
相关产品推荐
相关产品推荐

