【问题标题】:Mysqli connection in function PHP函数PHP中的Mysqli连接
【发布时间】:2015-06-08 14:21:51
【问题描述】:

我遇到了一个 PHP 问题。我在网上搜索过,但找不到答案。到目前为止,这是我的代码:

<?php
   $db_host = 'db_host';
   $db_user = 'db_user';
   $db_password = 'db_password';
   $db_name = 'db_name';
   //not showing you the real db login ofcourse

   $conn = mysqli_connect($db_host, $db_user, $db_password, $db_name);
   if($conn) {
      echo 'We are connected!';
   }

到这里,一切顺利。连接已建立,“我们已连接!”出现在屏幕上。

function login($username, $password, $conn) {
   $result = $conn->query("SELECT * FROM users");
   echo mysqli_errno($conn) . mysqli_error($conn);
} 

但是,当我运行此函数时,会弹出 mysqli 错误“未选择数据库”。于是我在函数前和函数中的文件中添加了如下代码,所以总的代码变成了:

<?php
   $db_host = 'db_host';
   $db_user = 'db_user';
   $db_password = 'db_password';
   $db_name = 'db_name';
   //not showing you the real db login ofcourse

   $conn = mysqli_connect($db_host, $db_user, $db_password, $db_name);
   if($conn) {
      echo 'We are connected!';
   }

   if (!mysqli_select_db($conn, $db_name)) {
      die("1st time failed");
   }

   function login($username, $password, $conn, $db_name) {
      if (!mysqli_select_db($conn, $db_name)) {
         die("2nd time failed");
      }
      $result = $conn->query("SELECT * FROM users");
      echo mysqli_errno($conn) . mysqli_error($conn);
   } 

   $username = 'test';
   $password = 'test';
   login($username, $password, $conn, $db_name);
?>

第一次添加数据库名称可以正常工作,但是在函数中它不起作用。我也尝试在函数内部使用 global $conn ,但这也不起作用。将 mysqli_connect() 更改为 new mysqli() 也没有任何效果。

提前致谢!

【问题讨论】:

  • 这是您的实际代码吗? $db_name 从未被分配。
  • 重复select_db 是没有意义的,除非你真的在使用多个不同的数据库。选择数据库后,它会在连接的整个生命周期内保持选中状态。
  • $db_host、$db_user、$db_password 和 $db_name 在此代码上方定义。如前所述,连接已完美建立,但之后它停止运行。
  • 但奇怪的是mysqli_select_db在函数内部不起作用对吧?
  • 您是否将正确的数据库名称作为参数传递给登录函数?尝试查看值是什么

标签: php mysqli


【解决方案1】:

请注意,此代码是根据您的代码重构的,不推荐登录逻辑。请尝试此代码并进行您认为需要的更改。

确保您的数据库信息也根据需要更新。

MyDB 类

Class MyDB {

protected $_DB_HOST = 'localhost';
protected $_DB_USER = 'user';
protected $_DB_PASS = 'password';
protected $_DB_NAME = 'table_name';
protected $_conn;

public function __construct() {
    $this->_conn = mysqli_connect($this->_DB_HOST, $this->_DB_USER, $this->_DB_PASS);
    if($this->_conn) {
        echo 'We are connected!<br>';
    }
}

public function connect() {
    if(!mysqli_select_db($this->_conn, $this->_DB_NAME)) {
        die("1st time failed<br>");
    }

    return $this->_conn;
}

}

登录类

Class Login {

protected $_conn;

public function __construct() {
    $db = new MyDB();
    $this->_conn = $db->connect();
}

//This is a HORRIBLE way to check your login. Please change your logic here. I am just kind of re-using what you got
public function login($username, $password) {
    $result = $this->_conn->query("SELECT * FROM user WHERE username ='$username' AND password='$password'");

    if(!$result) {
        echo mysqli_errno($this->_conn) . mysqli_error($this->_conn);
        return false;
    }

    return $result->fetch_row() > 0;
}

}

用法

$login = new Login();
$logged = $login->login('username', 'password');

if ($logged) {
    echo "yeah!! you are IN";
} else {
    echo "boo!! . Wrong username and password";
}

【讨论】:

  • 我查看了示波器,但不知道如何修复它。在函数内部使用全局 $conn 不起作用。
  • 不幸的是不起作用,我在函数前面添加了 'public' 和 'return $username 。 $密码;'在函数结束时,但现在页面什么都不做(白屏)。
  • 公众不是问题,问题是范围,我正在重构你的代码并发布它,等我完成后
  • 第二次否决您的“范围”答案。请再读一遍他的代码。
  • 在函数周围放置一个类会返回与开始时相同的错误。
猜你喜欢
  • 1970-01-01
  • 2018-12-30
  • 2018-03-09
  • 2011-04-10
  • 1970-01-01
  • 2017-01-07
  • 2016-02-08
  • 2013-03-18
  • 1970-01-01
相关资源
最近更新 更多