【问题标题】:PHP Variable not getting assigned after a successful run成功运行后未分配 PHP 变量
【发布时间】:2013-08-22 18:30:10
【问题描述】:

我有一个脚本可以将一个新用户注册到数据库中,它工作正常——用户确实被放入了数据库。但是,变量 $success 不会更改为 1(即使它应该更改为 1,因为查询成功)。每次我调用这个函数时,它都会返回 $success 的值为 0。 我唯一能想到的是查询是否仍然运行良好,但返回 FALSE。但是,当它用正确的信息更新表时,这真的没有多大意义吗?

  public function register($email, $password, $firstname, $lastname, $employee_number) {
                  //Lets us know if we registered properly or not
                  $success = 0;
                  //Salt and encrypt the password
                  $salt = generateSalt($password);
                  $encypted_password = generatePassword($salt, $password);
                  if(isset($this->db)) {
                          if($this->db->query("INSERT INTO users (email, encrypted_password, salt, first_name, last_name, employee_number) VALUES('$email', '$encypted_password', '$salt', '$firstname', '$lastname', '$employee_number');")) {
                                  $success = 1;
                          }

                  }       
                  $arr = array("success" => $success);
                  return json_encode($arr);   
          }

编辑:我知道我忘了提一些东西,这是使用 SQLite3。根据文档(http://www.php.net/manual/en/sqlite3.query.php),如果查询返回结果,它将返回一个 SQLite3Object。但是,如果它不返回结果,它应该只在查询成功时返回 TRUE,如果查询失败则返回 FALSE。 仔细检查语句的 var_dump,我得到了 NULL。最后我知道,INSERT 语句不应该返回任何东西,所以这有点奇怪。

【问题讨论】:

  • 您使用的是什么 SQL 引擎?您是否尝试过删除末尾的分号 (;)?
  • 试试 $result = $this->db->query(...); var_dump($result); 看看 db 调用真正返回了什么。
  • 如果您使用 CI,请在您的 if 块内尝试 $this->db->_error_message(); 以查看问题所在。

标签: php variable-assignment


【解决方案1】:

也许尝试将值分配给变量,然后检查变量值。如果没有别的,您可以 var_dump() 变量并查看函数正在输出什么。

public function register($email, $password, $firstname, $lastname, $employee_number) {
                  //Lets us know if we registered properly or not
                  $success = 0;
                  //Salt and encrypt the password
                  $salt = generateSalt($password);
                  $encypted_password = generatePassword($salt, $password);
                  if(isset($this->db)) {
                          $query = $this->db->query("INSERT INTO users (email, encrypted_password, salt, first_name, last_name, employee_number) VALUES('$email', '$encypted_password', '$salt', '$firstname', '$lastname', '$employee_number');";
                          if($query === true)) {
                                  $success = 1;
                          }

                  }       
                  $arr = array("success" => $success);
                  return json_encode($arr);   
          }

编辑:既然你现在知道函数返回了什么。您始终可以将检查设置为

if($query !== false){
    $success = 1;
}

【讨论】:

    【解决方案2】:

    您是否尝试过在“$success = 1;”之前/之后回显看看你是否真的进入了那部分代码?

    【讨论】:

      【解决方案3】:

      查看用于将数据插入数据库表的类手册。

      $this->db->query()
      

      并检查上述函数返回的值。上述功能可以更好地回答您的问题。

      【讨论】:

        【解决方案4】:

        这一切都取决于 $this->db->query() 的返回值,如果没有它的代码或文档,这是不可能知道的。据我所知, query() 可能不会返回任何内容。我会将 query() 的返回值保存到一个变量中,然后将其作为返回的一部分转储以进行调试。

        【讨论】:

          【解决方案5】:

          尝试将您的内部 if 语句更改为 try/catch 块。查看是否抛出异常。您可能会收到警告,因此即使它有效,它也不会到达内部块来设置 $success = 1。

          【讨论】:

            【解决方案6】:

            我们需要知道您使用的数据库类。

            其中一种解决方案是调用“插入”函数而不是查询函数。这应该会返回正确的结果。

            另一种解决方案是进行另一个查询并尝试获取您刚刚插入的数据。

            【讨论】:

              【解决方案7】:

              好吧,在四处挖掘并询问了几个同事之后,我发现在我之前从事此工作的人为 SQLite3 数据库编写了一个包装类,它使用与 PHP 内置的几乎完全相同的语法 - 相同函数名、参数和一切。 cmets 中甚至有一个链接指向详细介绍 SQLite3 的 PHP 网站。我已经从这里弄明白了,谢谢大家的建议。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-12-29
                • 2016-05-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-02-26
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多