繁体   English   中英

如何使用 mysqli 扩展连接到 PHP 中的 MySQL 数据库?

[英]How to connect to MySQL database in PHP using mysqli extension?

我有这样的代码来连接我的服务器数据库:

<?php

$con = mysqli_connect("", "username", "password", "databasename");
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

但是它显示“无法连接到MySQL”,这段代码有什么问题? 我第一次在 web 服务器上尝试它,而我的本地主机运行良好。

要使用 mysqli 连接到 MySQL 数据库,您需要执行 3 行代码。 您需要启用错误报告,创建 mysqli 类的实例并设置正确的字符集。

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'username', 'password', 'dbname', 3307);
$mysqli->set_charset('utf8mb4'); // always set the charset

mysqli 构造函数中的参数都是可选的,但大多数情况下,您希望至少传递其中的 4 个。 按照正确的顺序,它们是:

  1. MySQL 主机。 大多数情况下它是localhost ,但如果您连接到远程主机,它将是其他一些 IP 地址。 确保这不包含http协议部分。 它应该是一个 IP 地址或没有协议的 URL。
  2. 用户名。 这是您的 MySQL 用户的用户名。 要连接到 MySQL 服务器,您需要有一个具有正确权限的有效用户。
  3. 密码。
  4. 数据库名称。 这是您要连接的 MySQL 数据库名称。
  5. 港口。 大多数情况下,默认端口是正确的,但如果您将 wampserver 与 MariaDB 一起使用,则可能需要将其更改为 3307。
  6. 套接字名称。 指定应该使用的套接字或命名管道。

不幸的是,字符集不是这些参数之一,因此您必须使用专用函数来设置这个非常重要的参数。

请注意不要手动显示连接错误。 这样做是完全没有必要的,它会泄露您的凭据。

关于无关的说明:我不建议在新项目中使用 MySQLi。 请考虑使用PDO ,它总体上是用于连接 MySQL 的更好的 API。

mysqli_connect("","username" ,"password","databasename");//Server name cannot be NULL

使用 loaclhost 作为服务器名称(在 Loacl 中)

<?php
    $con = mysqli_connect("localhost","username" ,"password","databasename");

    if (mysqli_connect_errno())
    {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
?>

或者可以使用 MySQLi Procedural

<?php
    $servername = "localhost";
    $username = "username";
    $password = "password";

    // Create connection
    $con = mysqli_connect($servername, $username, $password);

    // Check connection
    if (!$con) {
        die("Connection failed: " . mysqli_connect_error());
    }
    echo "Connected successfully";
?>

编辑 01

$servername = "localhost";
$username = "root";
$password = "";

为什么要使用mysqli? 只需使用 PDO 来获得更安全的 mysql 连接,只需使用:

$hostname='localhost';
$username='root';
$password='';


$dbh = new PDO("mysql:host=$hostname;dbname=dbname",$username,$password);

我把它播种了,现在通过使用

$con=mysqli_connect("current_server_IP","username" ,"password","databasename");

现在,我可以连接到登录了。 谢谢你们的帮助!

您应该指定主机名

  $con = mysqli_connect("localhost","username" ,"password","databasename");

如果它返回一个错误,如

无法连接到 MySQL:无法通过套接字 '/var/lib/mysql/mysql.sock' 连接到本地 MySQL 服务器

localhost替换为127.0.0.1

如果仍然无法连接,请检查 mysql 服务器是否实际运行。

service mysqld start

然后,尝试以下操作之一:

(如果你还没有为mysql设置密码)

mysql -u root

如果你已经设置了密码

mysql -u root -p
$localhost = "localhost";
    $root = "root";
    $password = "";
    $con = mysql_connect($localhost,$root,$password) or die('Could not connect to database');
    mysql_select_db("db_name",$con);
<?php

$servername="";
$username=""; 
$password="";
$db="";

$conn=mysqli_connect($servername,$username,$password,$db);
//mysql_select_db($db);  
if (!$conn) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno($conn) . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error($conn) . PHP_EOL;
    exit;
}
@session_start();

$event_name = $_POST['first_name'];
$first_name = $_POST['last_name'];

$sql = "INSERT INTO customer(first_name, last_name,) VALUES ('$first_name', '$last_name')";

$conn->query($sql);
$lastInsertId = mysqli_insert_id($conn);

?>

更好的方法是将连接和登录参数分开。

<?php

class Database{

protected $url;
protected $user;
protected $passw;
protected $db;
protected $connection = null;

public function __construct($url,$user,$passw,$db){
    $this->url = $url;
    $this->user = $user;
    $this->passw = $passw;
    $this->db = $db;
}

public function __destruct() {
    if ($this->connection != null) {
        $this->closeConnection();
    }
}

protected function makeConnection(){
    //Make a connection
    $this->connection = new mysqli($this->url,$this->user,$this->passw,$this->db);
    if ($this->connection->connect_error) {
        echo "FAIL:" . $this->connection->connect_error;
    }
}

protected function closeConnection() {
    //Close the DB connection
    if ($this->connection != null) {
        $this->connection->close();
        $this->connection = null;
    }
}

protected function cleanParameters($p) {
    //prevent SQL injection
    $result = $this->connection->real_escape_string($p);
    return $result;
}

public function executeQuery($q, $params = null){
    $this->makeConnection();        
    if ($params != null) {
        $queryParts = preg_split("/\?/", $q);
        if (count($queryParts) != count($params) + 1) {
            return false;
        }
        $finalQuery = $queryParts[0];
        for ($i = 0; $i < count($params); $i++) {
        $finalQuery = $finalQuery . $this->cleanParameters($params[$i]) . $queryParts[$i + 1];
        }
        $q = $finalQuery;
    }
    $results = $this->connection->query($q);

    return $results;

}
}?>

这与数据库工厂相结合,可以保持数据分离和清洁。

<?php 
include_once 'database/Database.php';

class DatabaseFactory {
    private static $connection;

public static function getDatabase(){

   if (self::$connection == null) {
        $url = "URL";
        $user = "LOGIN";
        $passw = "PASSW";
        $db = "DB NAME";
        self::$connection = new Database($url, $user, $passw, $db);
    }
    return self::$connection;
}

} 
?>

之后,您可以轻松地使您的(基于类的)您的 CRUD 类(对象名称+数据库)

<?php
include_once "//CLASS";
include_once "//DatabaseFactory";

class CLASSDB
{
private static function getConnection(){
    return DatabaseFactory::getDatabase();
}
public static function getById($Id){
    $results = self::getConnection()->executeQuery("SELECT * from DB WHERE Id = '?'", array(Id));

    if ($results){
        $row = $results->fetch_array();
        $obj = self::convertRowToObject($row);
        return $obj;
    } else {
        return false;
    }
}
public static function getAll(){
    $query = 'SELECT * from DB';
    $results = self::getConnection()->executeQuery($query);
    $resultsArray = array();
    for ($i = 0; $i < $results->num_rows; $i++){
        $row = $results->fetch_array();
        $obj = self::convertRowToObject($row);
        $resultsArray[$i] = $obj;
    }
    return $resultsArray;
}
public static function getName($Id){
    $results = self::getConnection()->executeQuery("SELECT column from DB WHERE Id = '?'", array($Id));

        $row = $results->fetch_array();
        return $row['column'];
}
public static function convertRowToObject($row){
    return new CLASSNAME(
        $row['prop'],
        $row['prop'],
        $row['prop'],
        $row['prop']
    );
}
public static function insert ($obj){
    self::getConnection()->executeQuery("INSERT INTO DB VALUES (null, '?', '?', '?')",
        array($obj->prop, $obj->prop, $obj->prop));
}
public static function update ($propToUpdate, $Id){
    self::getConnection()->executeQuery("UPDATE User SET COLTOUPDATE = ? WHERE Id = ?",
        array($propToUpdate, $Id));
}
}

通过这种精细的编码,在前端选择项目是小菜一碟:

include 'CLASSDB';

<php
$results = CLASSDB::getFunction();
        foreach ($results as $class) {  
?>
<li><?php echo $class->prop ?><li>
<php } ?>

使用 php 连接到 MySQL 服务器的最简单方法。

$conn=new mysqli("localhost", "Username", "Password", "DbName");
if($conn->connect_error)
{
    die("connection faild:".$conn->connect_error);
}
echo "Connection Successfully..!";

像这样的本地主机(MySQLi 程序)

<?php

$servername ="localhost";

$username="username";//username like (root)

$password="password";//your database no password. (" ") 

$database="database";

$con=mysqli_connect($servername,$username,$password,$database);

if (!$con) {

    die("Connection failed: " . MySQL_connect_error());

}
else{

echo "Connected successfully";

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM