Hướng dẫn php db connection best practices - kết nối php db thực hành tốt nhất

Tôi muốn hỏi liệu thực tiễn tốt có thể có một phiên bản duy nhất của kết nối cơ sở dữ liệu hay khai báo mới mỗi lần khi chúng tôi cần? Tôi có hai thiết kế này được hiển thị dưới đây:

Show

Đây là lớp cơ sở dữ liệu:

host = $host;
        }

        if(isset($dbname) && !empty($dbname)) {
            $this->dbname = $dbname;
        }

        if(isset($username) && !empty($username)) {
            $this->username = $username;
        }

        if(isset($passwd) && !empty($passwd)) {
            $this->passwd = $passwd;
        }

        parent::__construct("mysql:dbname=$this->dbname;host=$this->host", $this->username, $this->passwd, NULL);
        parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        parent::setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }

}
?>

Phương pháp 1: Tiêm phụ thuộc

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>

Vì vậy, tôi sẽ làm điều này khi tôi muốn sử dụng các lớp:

update($id,$data);

    $emp = new Employee($db);
    $emp->delete($id);
?>

Hay các cách khác?

Phương pháp 2:

db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>

Và khi tôi muốn sử dụng nó, tôi sẽ:

update($id,$data);

    $emp = new Employee();
    $emp->delete($id);
?>

Phương pháp nào thích hợp hơn hoặc tốt hơn? Cung cấp một lời giải thích nếu có thể.

đọc thêm

Hướng dẫn sử dụng PHP: Các toán tử so sánh

Stack Overflow: is_null () vs ===

Loại bỏ dấu Accent (Diacritics)

Hầu hết các hướng dẫn web sẽ đề xuất sử dụng chức năng PHP

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
40 để loại bỏ các điều khoản. Tuy nhiên,
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
40 thường gặp rắc rối với đầu vào UTF-8 và đôi khi sẽ tạo ra các lỗi đáng ngạc nhiên.

Trở lại đầu trang

Kiểm tra xem giá trị là null hay sai

Sử dụng toán tử

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
24 để kiểm tra các giá trị sai của NULL và Boolean.

Mặc dù vậy, nó là ngôn ngữ phổ biến nhất trên web hiện nay. Do lịch sử lâu dài của nó, bạn sẽ tìm thấy rất nhiều hướng dẫn về cách thực hiện những việc cơ bản như băm mật khẩu và truy cập cơ sở dữ liệu. Vấn đề là trong số năm hướng dẫn, bạn có cơ hội tốt để tìm năm cách hoàn toàn khác nhau để làm một cái gì đó. Cách nào là cách của người Viking? Có cách nào khác có lỗi tinh tế hoặc gotchas không? Nó rất khó để tìm hiểu, và bạn sẽ nảy ra trên internet để cố gắng xác định câu trả lời đúng.

Đó cũng là một trong những lý do tại sao các lập trình viên PHP mới thường xuyên bị đổ lỗi cho mã xấu xí, lỗi thời hoặc không an toàn. Họ có thể giúp nó nếu kết quả đầu tiên của Google là một bài báo bốn năm dạy một phương pháp năm tuổi!

Tài liệu này cố gắng giải quyết điều đó. Đó là một nỗ lực để biên dịch một tập hợp các hướng dẫn cơ bản cho những gì có thể được coi là thực tiễn tốt nhất cho các vấn đề và nhiệm vụ phổ biến và khó hiểu trong PHP. Nếu một nhiệm vụ cấp thấp có nhiều cách tiếp cận và khó hiểu trong PHP, thì nó thuộc về đây.

Cái này là gì

Đó là một hướng dẫn cho thấy hướng đi tốt nhất để thực hiện khi đối mặt với một trong những nhiệm vụ cấp thấp phổ biến mà lập trình viên PHP có thể gặp phải không rõ ràng vì có nhiều lựa chọn mà PHP có thể cung cấp. Ví dụ: Kết nối với cơ sở dữ liệu là một nhiệm vụ phổ biến với một lượng lớn các giải pháp có thể trong PHP, không phải tất cả chúng đều tốt, do đó, nó được đưa vào tài liệu này.

Nó có một loạt các giải pháp ngắn, giới thiệu. Các ví dụ sẽ giúp bạn đứng dậy và chạy trong một môi trường cơ bản, và bạn nên thực hiện nghiên cứu của riêng mình để đưa chúng vào một cái gì đó hữu ích cho bạn.

Nó chỉ ra những gì chúng tôi coi là công nghệ của PHP. Tuy nhiên, điều này có nghĩa là nếu bạn sử dụng phiên bản PHP cũ hơn, một số tính năng cần thiết để loại bỏ các giải pháp này có thể không có sẵn cho bạn.

Đây là một tài liệu sống mà tôi sẽ làm hết sức mình để cập nhật khi PHP tiếp tục phát triển.

Những gì đây không phải là

Tài liệu này không phải là một hướng dẫn PHP. Bạn nên tìm hiểu những điều cơ bản và cú pháp của ngôn ngữ ở nơi khác.

Nó không phải là một hướng dẫn cho các vấn đề ứng dụng web phổ biến như lưu trữ cookie, bộ nhớ đệm, phong cách mã hóa, tài liệu, v.v.

Nó không phải là một hướng dẫn bảo mật. Mặc dù nó chạm đến một số vấn đề liên quan đến bảo mật, nhưng bạn đã dự kiến ​​sẽ thực hiện nghiên cứu của riêng mình khi bảo mật các ứng dụng PHP của bạn. Cụ thể, bạn nên xem xét cẩn thận bất kỳ giải pháp nào được đề xuất ở đây trước khi thực hiện nó. Mã của bạn, và bản sao và dán của bạn, là lỗi của riêng bạn.

Nó không phải là một người ủng hộ một phong cách, mẫu hoặc khung mã hóa nhất định.

Nó không phải là một người ủng hộ cho một cách nhất định để thực hiện các nhiệm vụ cấp cao như đăng ký người dùng, hệ thống đăng nhập, v.v.

Nó không phải là một giải pháp tất cả và cuối cùng, cũng không phải là giải pháp duy nhất. Một số phương pháp được mô tả dưới đây có thể không phải là thứ tốt nhất cho tình huống cụ thể của bạn và có rất nhiều cách khác nhau để đạt được cùng một kết thúc. Cụ thể, các ứng dụng web tải cao có thể được hưởng lợi từ các giải pháp bí truyền hơn cho một số vấn đề này.

Trở lại đầu trang

Chúng ta đang sử dụng phiên bản PHP nào?

Php 7.2.10-0ubuntu 0.18.04.1, được cài đặt trên Ubuntu 18.04 LTS.

PHP là con rùa 100 tuổi của thế giới web. Vỏ của nó được ghi với một lịch sử phong phú, phức tạp và ngớ ngẩn. Trong một môi trường lưu trữ chung, cấu hình của nó có thể hạn chế những gì bạn có thể làm.

Để giữ lại một phế liệu của sự tỉnh táo, chúng tôi sẽ tập trung vào chỉ một phiên bản của PHP: PHP 7.2.10-0ubuntu0.18.04.1. Đây là phiên bản của PHP bạn sẽ nhận được nếu bạn cài đặt nó bằng APT-Get trên máy chủ Ubuntu 18.04 LTS. Nói cách khác, nó có mặc định lành mạnh được sử dụng bởi nhiều người.PHP 7.2.10-0ubuntu0.18.04.1. This is the version of PHP you’ll get if you install it using apt-get on an Ubuntu 18.04 LTS server. In other words, it’s the sane default used by many.

Bạn có thể thấy rằng một số giải pháp này hoạt động trên các phiên bản PHP khác nhau hoặc cũ hơn. Nếu đó là trường hợp, thì bạn sẽ nghiên cứu ý nghĩa của các lỗi tinh tế hoặc các vấn đề bảo mật trong các phiên bản cũ này.

Trở lại đầu trang

Chúng ta đang sử dụng phiên bản PHP nào?

Php 7.2.10-0ubuntu 0.18.04.1, được cài đặt trên Ubuntu 18.04 LTS.

PHP là con rùa 100 tuổi của thế giới web. Vỏ của nó được ghi với một lịch sử phong phú, phức tạp và ngớ ngẩn. Trong một môi trường lưu trữ chung, cấu hình của nó có thể hạn chế những gì bạn có thể làm.

Để giữ lại một phế liệu của sự tỉnh táo, chúng tôi sẽ tập trung vào chỉ một phiên bản của PHP: PHP 7.2.10-0ubuntu0.18.04.1. Đây là phiên bản của PHP bạn sẽ nhận được nếu bạn cài đặt nó bằng APT-Get trên máy chủ Ubuntu 18.04 LTS. Nói cách khác, nó có mặc định lành mạnh được sử dụng bởi nhiều người.

Bạn có thể thấy rằng một số giải pháp này hoạt động trên các phiên bản PHP khác nhau hoặc cũ hơn. Nếu đó là trường hợp, thì bạn sẽ nghiên cứu ý nghĩa của các lỗi tinh tế hoặc các vấn đề bảo mật trong các phiên bản cũ này.

Lưu trữ mật khẩu

Sử dụng các hàm băm mật khẩu tích hợp với băm và so sánh mật khẩu.

  • Băm là cách tiêu chuẩn để bảo vệ mật khẩu của người dùng trước khi nó được lưu trữ trong cơ sở dữ liệu. Nhiều thuật toán băm phổ biến như MD5 và thậm chí SHA1 không an toàn để lưu trữ mật khẩu, bởi vì tin tặc có thể dễ dàng bẻ khóa mật khẩu được băm bằng các thuật toán đó.

đọc thêm

  • Cách lưu trữ mật khẩu một cách an toàn

Trở lại đầu trang

Kết nối và truy vấn cơ sở dữ liệu MySQL

Sử dụng PDO và chức năng tuyên bố đã chuẩn bị của nó.

Có nhiều cách để kết nối với cơ sở dữ liệu MySQL trong PHP. PDO (Đối tượng dữ liệu PHP) là mới nhất và mạnh mẽ nhất trong số chúng. PDO có giao diện nhất quán trên nhiều loại cơ sở dữ liệu khác nhau, sử dụng phương pháp hướng đối tượng và hỗ trợ nhiều tính năng được cung cấp bởi cơ sở dữ liệu mới hơn.

Bạn nên sử dụng các chức năng tuyên bố đã chuẩn bị PDO để giúp ngăn ngừa các cuộc tấn công tiêm SQL. Sử dụng chức năng bindValue() đảm bảo rằng SQL của bạn an toàn sau các cuộc tấn công tiêm SQL bậc nhất. (Mặc dù vậy, đây không phải là 100% tuyệt vời, hãy xem đọc thêm để biết thêm chi tiết.) PDO làm cho tất cả những gì không cần thiết.

Thí dụ

________số 8

Gotchas

  • Không đặt ký tự được đặt thành UTF8MB4 trong chuỗi kết nối có thể khiến dữ liệu Unicode được lưu trữ không chính xác trong cơ sở dữ liệu của bạn, tùy thuộc vào cấu hình của bạn.
  • Ngay cả khi bạn tuyên bố nhân vật của mình được đặt là UTF8MB4, hãy đảm bảo rằng các bảng cơ sở dữ liệu thực tế của bạn nằm trong bộ ký tự UTF8MB4. Vì lý do tại sao chúng tôi sử dụng UTF8MB4 thay vì chỉ UTF8, hãy kiểm tra phần PHP và UTF-8.
  • Cho phép các kết nối liên tục có thể có thể dẫn đến các vấn đề liên quan đến đồng thời kỳ lạ. Đây là một vấn đề PHP, nó là một vấn đề cấp độ ứng dụng. Các kết nối dai dẳng là an toàn để sử dụng miễn là bạn xem xét hậu quả. Xem câu hỏi Overflow Stack này.

đọc thêm

  • Hướng dẫn sử dụng PHP: PDO
  • Tại sao bạn nên sử dụng PDO PHP để truy cập cơ sở dữ liệu
  • Stack Overflow: PHP PDO so với MySQL_Connect bình thường
  • Stack Overflow: Các báo cáo được chuẩn bị PDO có đủ để ngăn ngừa tiêm SQL không?
  • Stack Overflow: Có nên sử dụng tên Set Set hay không

Trở lại đầu trang

Kết nối và truy vấn cơ sở dữ liệu MySQL

Sử dụng PDO và chức năng tuyên bố đã chuẩn bị của nó.

Có nhiều cách để kết nối với cơ sở dữ liệu MySQL trong PHP. PDO (Đối tượng dữ liệu PHP) là mới nhất và mạnh mẽ nhất trong số chúng. PDO có giao diện nhất quán trên nhiều loại cơ sở dữ liệu khác nhau, sử dụng phương pháp hướng đối tượng và hỗ trợ nhiều tính năng được cung cấp bởi cơ sở dữ liệu mới hơn.

Bạn nên sử dụng các chức năng tuyên bố đã chuẩn bị PDO để giúp ngăn ngừa các cuộc tấn công tiêm SQL. Sử dụng chức năng bindValue() đảm bảo rằng SQL của bạn an toàn sau các cuộc tấn công tiêm SQL bậc nhất. (Mặc dù vậy, đây không phải là 100% tuyệt vời, hãy xem đọc thêm để biết thêm chi tiết.) PDO làm cho tất cả những gì không cần thiết.

Thí dụ

________số 8

Gotchas

  • Không đặt ký tự được đặt thành UTF8MB4 trong chuỗi kết nối có thể khiến dữ liệu Unicode được lưu trữ không chính xác trong cơ sở dữ liệu của bạn, tùy thuộc vào cấu hình của bạn.
  • Ngay cả khi bạn tuyên bố nhân vật của mình được đặt là UTF8MB4, hãy đảm bảo rằng các bảng cơ sở dữ liệu thực tế của bạn nằm trong bộ ký tự UTF8MB4. Vì lý do tại sao chúng tôi sử dụng UTF8MB4 thay vì chỉ UTF8, hãy kiểm tra phần PHP và UTF-8.

đọc thêm

  • Cho phép các kết nối liên tục có thể có thể dẫn đến các vấn đề liên quan đến đồng thời kỳ lạ. Đây là một vấn đề PHP, nó là một vấn đề cấp độ ứng dụng. Các kết nối dai dẳng là an toàn để sử dụng miễn là bạn xem xét hậu quả. Xem câu hỏi Overflow Stack này.

Trở lại đầu trang

Kết nối và truy vấn cơ sở dữ liệu MySQL

Sử dụng PDO và chức năng tuyên bố đã chuẩn bị của nó.

Có nhiều cách để kết nối với cơ sở dữ liệu MySQL trong PHP. PDO (Đối tượng dữ liệu PHP) là mới nhất và mạnh mẽ nhất trong số chúng. PDO có giao diện nhất quán trên nhiều loại cơ sở dữ liệu khác nhau, sử dụng phương pháp hướng đối tượng và hỗ trợ nhiều tính năng được cung cấp bởi cơ sở dữ liệu mới hơn.

Bạn nên sử dụng các chức năng tuyên bố đã chuẩn bị PDO để giúp ngăn ngừa các cuộc tấn công tiêm SQL. Sử dụng chức năng bindValue() đảm bảo rằng SQL của bạn an toàn sau các cuộc tấn công tiêm SQL bậc nhất. (Mặc dù vậy, đây không phải là 100% tuyệt vời, hãy xem đọc thêm để biết thêm chi tiết.) PDO làm cho tất cả những gì không cần thiết.

Thí dụ

________số 8

đọc thêm

  • Gotchas
  • Không đặt ký tự được đặt thành UTF8MB4 trong chuỗi kết nối có thể khiến dữ liệu Unicode được lưu trữ không chính xác trong cơ sở dữ liệu của bạn, tùy thuộc vào cấu hình của bạn.

Trở lại đầu trang

Kết nối và truy vấn cơ sở dữ liệu MySQL

Sử dụng PDO và chức năng tuyên bố đã chuẩn bị của nó.

Có nhiều cách để kết nối với cơ sở dữ liệu MySQL trong PHP. PDO (Đối tượng dữ liệu PHP) là mới nhất và mạnh mẽ nhất trong số chúng. PDO có giao diện nhất quán trên nhiều loại cơ sở dữ liệu khác nhau, sử dụng phương pháp hướng đối tượng và hỗ trợ nhiều tính năng được cung cấp bởi cơ sở dữ liệu mới hơn.

Bởi vì các chuỗi được trích dẫn kép được đánh giá tại thời điểm chạy, lý thuyết là việc sử dụng các chuỗi được trình duyệt một lần sẽ cải thiện hiệu suất vì PHP won đã phải đánh giá từng chuỗi. Mặc dù điều này có thể đúng ở một quy mô nhất định, nhưng đối với ứng dụng thực tế trung bình, sự khác biệt rất nhỏ đến nỗi nó không thực sự quan trọng. Vì vậy, đối với một ứng dụng trung bình, nó không quan trọng những gì bạn chọn. Đối với các ứng dụng cực kỳ tải, nó có thể quan trọng một chút. Đưa ra lựa chọn tùy thuộc vào những gì ứng dụng của bạn cần, nhưng bất cứ điều gì bạn chọn, hãy nhất quán.

đọc thêm

  • Hướng dẫn sử dụng PHP: Chuỗi
  • Điểm chuẩn PHP (cuộn xuống các loại báo giá)
  • Stack Overflow: Có lợi ích hiệu suất cho các báo giá đơn lẻ so với dấu ngoặc kép trong PHP không?

Trở lại đầu trang

db = new Database(); } //Some update and insert below here } class Employee { private $db; public function __construct() { $this->db = new Database(); } //Some update and insert below here } ?> 1 so với db = new Database(); } //Some update and insert below here } class Employee { private $db; public function __construct() { $this->db = new Database(); } //Some update and insert below here } ?> 2

Sử dụng db = new Database(); } //Some update and insert below here } class Employee { private $db; public function __construct() { $this->db = new Database(); } //Some update and insert below here } ?> 1 trừ khi khả năng đọc, hằng số lớp hoặc tối ưu hóa vi mô là mối quan tâm.

Theo truyền thống trong PHP, bạn sẽ xác định các hằng số bằng cách sử dụng hàm

db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1. Nhưng tại một số điểm PHP đã đạt được khả năng cũng khai báo các hằng số với từ khóa
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2. Bạn nên sử dụng cái nào khi xác định hằng số của bạn?

Câu trả lời nằm ở sự khác biệt nhỏ giữa hai phương pháp.

  1. db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    1 định nghĩa các hằng số tại thời điểm chạy, trong khi
    db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    2 định nghĩa các hằng số tại thời điểm biên dịch. Điều này mang lại cho
    db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    2 một cạnh tốc độ rất nhẹ, nhưng không đáng lo ngại nào trừ khi bạn xây dựng phần mềm quy mô lớn.
  2. db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    1 đặt các hằng số trong phạm vi toàn cầu, mặc dù bạn có thể bao gồm các không gian tên trong tên liên tục của bạn. Điều đó có nghĩa là bạn có thể sử dụng
    db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    1 để xác định các hằng số lớp.
  3. db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    1 cho phép bạn sử dụng các biểu thức cả trong tên không đổi và trong giá trị không đổi, không giống như
    db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    2 không cho phép. Điều này làm cho
    db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    1 linh hoạt hơn nhiều.
  4. db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    1 có thể được gọi trong một khối
    update($id,$data);
    
        $emp = new Employee();
        $emp->delete($id);
    ?>
    
    5, trong khi
    db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    2 không thể.

Thí dụ

update($id,$data);

    $emp = new Employee();
    $emp->delete($id);
?>
7

Bởi vì

db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1 cuối cùng là linh hoạt hơn, nó là một trong những bạn nên sử dụng để tránh đau đầu trừ khi bạn đặc biệt yêu cầu các hằng số lớp. Sử dụng
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2 thường dẫn đến mã dễ đọc hơn, nhưng với chi phí linh hoạt.

Bất cứ ai bạn sử dụng, hãy nhất quán!

đọc thêm

  • Overflow Stack: xác định () vs const
  • Hướng dẫn sử dụng PHP: Hằng số
  • Overflow Stack: Xác định () vs Biến

Trở lại đầu trang

db = new Database(); } //Some update and insert below here } class Employee { private $db; public function __construct() { $this->db = new Database(); } //Some update and insert below here } ?> 1 so với db = new Database(); } //Some update and insert below here } class Employee { private $db; public function __construct() { $this->db = new Database(); } //Some update and insert below here } ?> 2

Sử dụng db = new Database(); } //Some update and insert below here } class Employee { private $db; public function __construct() { $this->db = new Database(); } //Some update and insert below here } ?> 1 trừ khi khả năng đọc, hằng số lớp hoặc tối ưu hóa vi mô là mối quan tâm.

Theo truyền thống trong PHP, bạn sẽ xác định các hằng số bằng cách sử dụng hàm

db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1. Nhưng tại một số điểm PHP đã đạt được khả năng cũng khai báo các hằng số với từ khóa
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2. Bạn nên sử dụng cái nào khi xác định hằng số của bạn?

Câu trả lời nằm ở sự khác biệt nhỏ giữa hai phương pháp.

đọc thêm

  • db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    1 định nghĩa các hằng số tại thời điểm chạy, trong khi
    db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    2 định nghĩa các hằng số tại thời điểm biên dịch. Điều này mang lại cho
    db = new Database();
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct() {
            $this->db = new Database();
        }
    
        //Some update and insert below here
    }
    ?>
    
    2 một cạnh tốc độ rất nhẹ, nhưng không đáng lo ngại nào trừ khi bạn xây dựng phần mềm quy mô lớn.

Trở lại đầu trang

db = new Database(); } //Some update and insert below here } class Employee { private $db; public function __construct() { $this->db = new Database(); } //Some update and insert below here } ?> 1 so với db = new Database(); } //Some update and insert below here } class Employee { private $db; public function __construct() { $this->db = new Database(); } //Some update and insert below here } ?> 2

Sử dụng db = new Database(); } //Some update and insert below here } class Employee { private $db; public function __construct() { $this->db = new Database(); } //Some update and insert below here } ?> 1 trừ khi khả năng đọc, hằng số lớp hoặc tối ưu hóa vi mô là mối quan tâm.

Theo truyền thống trong PHP, bạn sẽ xác định các hằng số bằng cách sử dụng hàm

db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1. Nhưng tại một số điểm PHP đã đạt được khả năng cũng khai báo các hằng số với từ khóa
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2. Bạn nên sử dụng cái nào khi xác định hằng số của bạn?

Câu trả lời nằm ở sự khác biệt nhỏ giữa hai phương pháp.

db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1 định nghĩa các hằng số tại thời điểm chạy, trong khi
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2 định nghĩa các hằng số tại thời điểm biên dịch. Điều này mang lại cho
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2 một cạnh tốc độ rất nhẹ, nhưng không đáng lo ngại nào trừ khi bạn xây dựng phần mềm quy mô lớn.

db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1 đặt các hằng số trong phạm vi toàn cầu, mặc dù bạn có thể bao gồm các không gian tên trong tên liên tục của bạn. Điều đó có nghĩa là bạn có thể sử dụng
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1 để xác định các hằng số lớp.

db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1 cho phép bạn sử dụng các biểu thức cả trong tên không đổi và trong giá trị không đổi, không giống như
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2 không cho phép. Điều này làm cho
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1 linh hoạt hơn nhiều.

db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1 có thể được gọi trong một khối
update($id,$data);

    $emp = new Employee();
    $emp->delete($id);
?>
5, trong khi
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2 không thể.

Thí dụ

update($id,$data);

    $emp = new Employee();
    $emp->delete($id);
?>
7

Bởi vì
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1 cuối cùng là linh hoạt hơn, nó là một trong những bạn nên sử dụng để tránh đau đầu trừ khi bạn đặc biệt yêu cầu các hằng số lớp. Sử dụng
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2 thường dẫn đến mã dễ đọc hơn, nhưng với chi phí linh hoạt.

Bất cứ ai bạn sử dụng, hãy nhất quán!

Overflow Stack: xác định () vs const

Hướng dẫn sử dụng PHP: Hằng số

Overflow Stack: Xác định () vs Biến

Thí dụ

update($id,$data);

    $emp = new Employee();
    $emp->delete($id);
?>
7

Bởi vì
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
1 cuối cùng là linh hoạt hơn, nó là một trong những bạn nên sử dụng để tránh đau đầu trừ khi bạn đặc biệt yêu cầu các hằng số lớp. Sử dụng
db = new Database();
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    //Some update and insert below here
}
?>
2 thường dẫn đến mã dễ đọc hơn, nhưng với chi phí linh hoạt.

  • Nếu bạn di chuyển mã APCU từ phiên bản APUC trước 16.04, hãy lưu ý rằng các tên hàm đã thay đổi từ 3 thành 4. Ví dụ, 5 đã trở thành 6.

đọc thêm

  • Hướng dẫn sử dụng PHP: Memcached
  • PECL: APCU
  • Stack Overflow: Sử dụng Memcache vs Memcached với PHP
  • Stack Overflow: Memcached vs APC, tôi nên chọn cái nào?

Trở lại đầu trang

PHP và regex

Sử dụng họ chức năng PCRE ( 7).

Trước khi PHP 7 xuất hiện, PHP có hai cách sử dụng các biểu thức chính quy khác nhau: các hàm pcre (tương thích perl, 7) và các hàm POSIX (POSIX mở rộng, 9).

Mỗi gia đình các chức năng sử dụng một hương vị hơi khác nhau của biểu hiện thông thường. May mắn cho chúng tôi, các chức năng 9 đã được loại bỏ trong Php 7, vì vậy nguồn nhầm lẫn này đã qua chúng tôi.

Gotchas

  • Hãy nhớ sử dụng cờ password_hash()1 khi làm việc với regexes, để đảm bảo bạn làm việc ở chế độ Unicode.

Đọc thêm

  • Hướng dẫn sử dụng PHP: PCRE
  • Bắt đầu với các biểu thức thông thường PHP

Trở lại đầu trang

PHP và regex

Sử dụng họ chức năng PCRE ( 7).

Trước khi PHP 7 xuất hiện, PHP có hai cách sử dụng các biểu thức chính quy khác nhau: các hàm pcre (tương thích perl, 7) và các hàm POSIX (POSIX mở rộng, 9).

Mỗi gia đình các chức năng sử dụng một hương vị hơi khác nhau của biểu hiện thông thường. May mắn cho chúng tôi, các chức năng 9 đã được loại bỏ trong Php 7, vì vậy nguồn nhầm lẫn này đã qua chúng tôi.

Gotchas

Hãy nhớ sử dụng cờ password_hash()1 khi làm việc với regexes, để đảm bảo bạn làm việc ở chế độ Unicode.

Đọc thêm

Hướng dẫn sử dụng PHP: PCRE

Bắt đầu với các biểu thức thông thường PHP

Phục vụ PHP từ máy chủ web

Sử dụng PHP-FPM.

Có một số cách cấu hình một máy chủ web để phục vụ PHP. Quay trở lại thời kỳ đồ đá, chúng tôi sẽ sử dụng Apache Mod Mod_PhP. MOD_PHP đính kèm PHP vào chính Apache, nhưng Apache thực hiện một công việc rất tệ trong việc quản lý nó. Bạn sẽ gặp phải các vấn đề về bộ nhớ nghiêm trọng ngay khi bạn nhận được bất kỳ loại lưu lượng thực sự nào.

Hai tùy chọn mới sớm trở nên phổ biến: mod_fastcgi và mod_fcgid. Cả hai điều này giữ một số lượng hạn chế các quy trình PHP đang chạy và Apache gửi các yêu cầu đến các giao diện này để xử lý việc thực thi PHP thay mặt cho nó. Bởi vì các thư viện này giới hạn số lượng quá trình PHP còn sống, việc sử dụng bộ nhớ bị giảm đáng kể mà không ảnh hưởng đến hiệu suất.

Một số người thông minh đã tạo ra một triển khai FASTCGI được thiết kế đặc biệt để hoạt động thực sự tốt với PHP và họ gọi nó là PHP-FPM. Đây là giải pháp tiêu chuẩn cho các máy chủ web kể từ Ubuntu 12.04.

Trong những năm kể từ Ubuntu 12.04, Apache đã giới thiệu một phương pháp mới để tương tác với PHP-FPM: MOD_PROXY_FCGI. Chúng tôi sẽ sử dụng mô -đun này để định tuyến các yêu cầu PHP mà Apache nhận được cho phiên bản FPM.

Ví dụ sau đây là cho Apache 2.4.29, nhưng PHP-FPM cũng hoạt động cho các máy chủ web khác như Nginx.

Cài đặt PHP-FPM và Apache

Bạn có thể cài đặt PHP-FPM và Apache trên Ubuntu 18.04 bằng cách chạy các lệnh này trong thiết bị đầu cuối của bạn:

đọc thêm

  • password_hash()2
  • Đầu tiên, chúng tôi sẽ tạo ra một nhóm FPM PHP mới sẽ phục vụ ứng dụng của chúng tôi.
  • Dán phần sau vào password_hash()3:

Trở lại đầu trang

PHP và regex

Sử dụng họ chức năng PCRE ( 7).

Trước khi PHP 7 xuất hiện, PHP có hai cách sử dụng các biểu thức chính quy khác nhau: các hàm pcre (tương thích perl, 7) và các hàm POSIX (POSIX mở rộng, 9).

Mỗi gia đình các chức năng sử dụng một hương vị hơi khác nhau của biểu hiện thông thường. May mắn cho chúng tôi, các chức năng 9 đã được loại bỏ trong Php 7, vì vậy nguồn nhầm lẫn này đã qua chúng tôi.

Gotchas

Hãy nhớ sử dụng cờ password_hash()1 khi làm việc với regexes, để đảm bảo bạn làm việc ở chế độ Unicode.

Đọc thêm

Hướng dẫn sử dụng PHP: PCRE

đọc thêm

  • Bắt đầu với các biểu thức thông thường PHP

Trở lại đầu trang

PHP và regex

Sử dụng họ chức năng PCRE ( 7).

Trước khi PHP 7 xuất hiện, PHP có hai cách sử dụng các biểu thức chính quy khác nhau: các hàm pcre (tương thích perl, 7) và các hàm POSIX (POSIX mở rộng, 9).

Đọc thêm

Hướng dẫn sử dụng PHP: PCRE

đọc thêm

  • Bắt đầu với các biểu thức thông thường PHP
  • Phục vụ PHP từ máy chủ web

Trở lại đầu trang

PHP và regex

Sử dụng họ chức năng PCRE ( 7).

Trước khi PHP 7 xuất hiện, PHP có hai cách sử dụng các biểu thức chính quy khác nhau: các hàm pcre (tương thích perl, 7) và các hàm POSIX (POSIX mở rộng, 9).

Mỗi gia đình các chức năng sử dụng một hương vị hơi khác nhau của biểu hiện thông thường. May mắn cho chúng tôi, các chức năng 9 đã được loại bỏ trong Php 7, vì vậy nguồn nhầm lẫn này đã qua chúng tôi.

Mặc dù có thể hấp dẫn khi sử dụng các biểu thức chính quy để vệ sinh HTML, không làm điều này. HTML là một ngôn ngữ phức tạp và nó hầu như đảm bảo rằng mọi nỗ lực bạn thực hiện trong việc sử dụng các biểu thức chính quy để vệ sinh HTML sẽ thất bại.

Hướng dẫn sử dụng PHP: Các loại bộ lọc

Nếu bạn đọc phần trên các địa chỉ email xác thực, bạn cũng có thể đang xem xét sử dụng hàm bindValue()3. Tuy nhiên, chức năng bindValue()3 có vấn đề với việc phá vỡ dòng và yêu cầu cấu hình không trực quan để phản ánh chặt chẽ hàm bindValue()6. Vì vậy, nó cũng không phải là một lựa chọn tốt.

Vệ sinh cho các yêu cầu đơn giản

Nếu ứng dụng web của bạn chỉ cần thoát hoàn toàn (và do đó khiến cho vô hại, nhưng không loại bỏ hoàn toàn) HTML, hãy sử dụng chức năng bindValue()6 tích hợp của PHP. Chức năng này nhanh hơn nhiều so với máy lọc HTML, bởi vì nó không thực hiện bất kỳ xác thực nào trên HTML, nó chỉ thoát khỏi mọi thứ.

bindValue()6 khác với anh em họ PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => false ) ); $handle = $link->prepare('select Username from Users where UserId = ? or Username = ? limit ?'); $handle->bindValue(1, 100); $handle->bindValue(2, 'Bilbo Baggins'); $handle->bindValue(3, 5); $handle->execute(); // Using the fetchAll() method might be too resource-heavy if you're selecting a truly massive amount of rows. // If that's the case, you can use the fetch() method and loop through each result row one by one. // You can also return arrays and other things instead of objects. See the PDO documentation for details. $result = $handle->fetchAll(PDO::FETCH_OBJ); foreach($result as $row){ print($row->Username); } ?>4 của nó ở chỗ nó mã hóa tất cả các thực thể HTML hiện hành, không chỉ là một tập hợp con nhỏ.

Thí dụ

PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => false ) ); $handle = $link->prepare('select Username from Users where UserId = ? or Username = ? limit ?'); $handle->bindValue(1, 100); $handle->bindValue(2, 'Bilbo Baggins'); $handle->bindValue(3, 5); $handle->execute(); // Using the fetchAll() method might be too resource-heavy if you're selecting a truly massive amount of rows. // If that's the case, you can use the fetch() method and loop through each result row one by one. // You can also return arrays and other things instead of objects. See the PDO documentation for details. $result = $handle->fetchAll(PDO::FETCH_OBJ); foreach($result as $row){ print($row->Username); } ?>5

Vệ sinh cho các yêu cầu phức tạp

Đối với nhiều ứng dụng web, chỉ cần thoát HTML là đủ. Bạn có thể muốn loại bỏ hoàn toàn bất kỳ HTML nào hoặc cho phép một tập hợp nhỏ HTML thông qua. Để làm điều này, hãy sử dụng thư viện máy lọc HTML.

HTML Purifier là một thư viện được thử nghiệm tốt nhưng chậm. Đó là lý do tại sao bạn nên sử dụng bindValue()6 nếu các yêu cầu của bạn không phức tạp, bởi vì nó sẽ nhanh hơn nhiều.

Máy lọc HTML có lợi thế hơn bindValue()7 vì nó xác nhận HTML trước khi vệ sinh nó. Điều đó có nghĩa là nếu người dùng đã nhập HTML không hợp lệ, HTML Purifier có cơ hội tốt hơn để bảo tồn ý nghĩa dự định của HTML so với bindValue()7. Nó cũng có khả năng tùy biến cao, cho phép bạn đưa danh sách trắng một tập hợp HTML để giữ đầu ra.

Nhược điểm là nó khá chậm, nó đòi hỏi một số thiết lập có thể không khả thi trong môi trường lưu trữ chung và tài liệu thường phức tạp và không rõ ràng. Ví dụ sau là một cấu hình cơ bản; Kiểm tra tài liệu để đọc về các tính năng nâng cao hơn HTML Purifier cung cấp.

Thí dụ

PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => false ) ); $handle = $link->prepare('select Username from Users where UserId = ? or Username = ? limit ?'); $handle->bindValue(1, 100); $handle->bindValue(2, 'Bilbo Baggins'); $handle->bindValue(3, 5); $handle->execute(); // Using the fetchAll() method might be too resource-heavy if you're selecting a truly massive amount of rows. // If that's the case, you can use the fetch() method and loop through each result row one by one. // You can also return arrays and other things instead of objects. See the PDO documentation for details. $result = $handle->fetchAll(PDO::FETCH_OBJ); foreach($result as $row){ print($row->Username); } ?>5

Vệ sinh cho các yêu cầu phức tạp

  • Đối với nhiều ứng dụng web, chỉ cần thoát HTML là đủ. Bạn có thể muốn loại bỏ hoàn toàn bất kỳ HTML nào hoặc cho phép một tập hợp nhỏ HTML thông qua. Để làm điều này, hãy sử dụng thư viện máy lọc HTML.
  • HTML Purifier là một thư viện được thử nghiệm tốt nhưng chậm. Đó là lý do tại sao bạn nên sử dụng bindValue()6 nếu các yêu cầu của bạn không phức tạp, bởi vì nó sẽ nhanh hơn nhiều.
  • Máy lọc HTML có lợi thế hơn bindValue()7 vì nó xác nhận HTML trước khi vệ sinh nó. Điều đó có nghĩa là nếu người dùng đã nhập HTML không hợp lệ, HTML Purifier có cơ hội tốt hơn để bảo tồn ý nghĩa dự định của HTML so với bindValue()7. Nó cũng có khả năng tùy biến cao, cho phép bạn đưa danh sách trắng một tập hợp HTML để giữ đầu ra.

Nhược điểm là nó khá chậm, nó đòi hỏi một số thiết lập có thể không khả thi trong môi trường lưu trữ chung và tài liệu thường phức tạp và không rõ ràng. Ví dụ sau là một cấu hình cơ bản; Kiểm tra tài liệu để đọc về các tính năng nâng cao hơn HTML Purifier cung cấp.

  • PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT => false ) ); $handle = $link->prepare('select Username from Users where UserId = ? or Username = ? limit ?'); $handle->bindValue(1, 100); $handle->bindValue(2, 'Bilbo Baggins'); $handle->bindValue(3, 5); $handle->execute(); // Using the fetchAll() method might be too resource-heavy if you're selecting a truly massive amount of rows. // If that's the case, you can use the fetch() method and loop through each result row one by one. // You can also return arrays and other things instead of objects. See the PDO documentation for details. $result = $handle->fetchAll(PDO::FETCH_OBJ); foreach($result as $row){ print($row->Username); } ?>9
  • Gotchas
  • Sử dụng bindValue()6 với mã hóa ký tự sai có thể dẫn đến đầu ra đáng ngạc nhiên. Luôn đảm bảo rằng bạn chỉ định một mã hóa ký tự khi gọi hàm và nó phù hợp với mã hóa của chuỗi được khử trùng. Xem phần UTF-8 để biết thêm chi tiết.
  • Luôn bao gồm các tham số mã hóa 1 và ký tự khi sử dụng bindValue()6. Theo mặc định, bindValue()6 không mã hóa các trích dẫn duy nhất. Thật là một mặc định ngu ngốc!

Máy lọc HTML cực kỳ chậm đối với HTML phức tạp. Cân nhắc thiết lập một giải pháp bộ đệm như APCU để lưu trữ kết quả vệ sinh để sử dụng sau.

đọc thêm

So sánh giữa chất khử trùng PHP HTML

Overflow Stack: Ngăn chặn XSS bằng dải_tags ()?

Stack Overflow: Phương pháp nào tốt nhất để vệ sinh đầu vào của người dùng với PHP?

Stack Overflow: Filter_ SANITIZE_ ĐẶC BIỆT

Trở lại đầu trang

PHP và UTF-8

Không có người nào. Hãy cẩn thận, chi tiết, và nhất quán.

UTF-8 trong PHP hút. Xin lỗi.

Phần khó là nhớ sử dụng các hàm 6 mọi lúc. Nếu bạn quên thậm chí chỉ một lần, chuỗi unicode của bạn có cơ hội bị cắt xén trong quá trình xử lý tiếp theo.

Không phải tất cả các hàm chuỗi đều có đối tác 6. Nếu có một người cho những gì bạn muốn làm, thì bạn có thể không gặp may.

Ngoài ra, bạn nên sử dụng hàm

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
05 ở đầu mỗi tập lệnh PHP bạn viết (hoặc ở đầu tập lệnh bao gồm toàn cầu của bạn) và hàm
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
06 ngay sau khi tập lệnh của bạn xuất ra trình duyệt. Xác định rõ ràng việc mã hóa các chuỗi của bạn trong mỗi kịch bản sẽ giúp bạn tiết kiệm rất nhiều đau đầu trên đường.

Cuối cùng, nhiều hàm PHP hoạt động trên các chuỗi có tham số tùy chọn cho phép bạn chỉ định mã hóa ký tự. Bạn phải luôn luôn chỉ ra rõ ràng UTF-8 khi được cung cấp tùy chọn. Ví dụ: bindValue()6 có tùy chọn mã hóa ký tự và bạn phải luôn chỉ định UTF-8 nếu xử lý các chuỗi đó.

UTF-8 ở cấp hệ điều hành

Thường thì bạn sẽ thấy mình viết các tệp với nội dung hoặc tên tệp được mã hóa trong một số hương vị của Unicode. PHP có thể chạy trên nhiều hệ điều hành, bao gồm Linux và Windows; Nhưng thật đáng buồn khi nó xử lý các tên tệp unicode khác nhau trên mỗi nền tảng do kỳ quặc cấp hệ điều hành.

Linux và OSX dường như xử lý các tên tệp UTF-8 khá tốt. Windows, tuy nhiên, không có. Nếu bạn cố gắng sử dụng PHP để ghi vào một tệp có các ký tự không phải ASCII trong tên tệp trong Windows, bạn có thể phát hiện ra rằng tên tệp được hiển thị với các ký tự lạ hoặc bị hỏng.

Có vẻ như không phải là một cách giải quyết dễ dàng, di động ở đây. Trong Linux và OSX, bạn có thể mã hóa tên tệp của mình bằng UTF-8, nhưng trong Windows, bạn phải nhớ mã hóa bằng ISO-8859-1.

Nếu bạn không muốn bận tâm đến việc kiểm tra tập lệnh của mình nếu nó chạy trên Windows hay không, bạn luôn có thể mã hóa URL tất cả các tên tệp của mình trước khi viết chúng. Điều này hoạt động hiệu quả xung quanh các quirks Unicode bằng cách thể hiện các ký tự unicode bằng một tập hợp con của ASCII.

UTF-8 ở cấp độ MySQL

Nếu tập lệnh PHP của bạn truy cập MySQL, thì có một cơ hội chuỗi của bạn có thể được lưu trữ dưới dạng chuỗi không UTF-8 trong cơ sở dữ liệu ngay cả khi bạn tuân theo tất cả các biện pháp phòng ngừa ở trên.

Để đảm bảo các chuỗi của bạn đi từ PHP sang MySQL dưới dạng UTF-8, hãy đảm bảo cơ sở dữ liệu và bảng của bạn được đặt thành bộ và đối chiếu ký tự UTF8MB4 và bạn sử dụng ký tự UTF8MB4 trong chuỗi kết nối PDO. Ví dụ, hãy xem phần kết nối và truy vấn cơ sở dữ liệu MySQL. Điều này là cực kỳ quan trọng.

Lưu ý rằng bạn phải sử dụng bộ ký tự UTF8MB4 để hỗ trợ UTF-8 hoàn chỉnh, không phải bộ ký tự UTF8! Xem đọc thêm cho lý do tại sao.

UTF-8 ở cấp trình duyệt

Sử dụng chức năng

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
06 để đảm bảo rằng tập lệnh PHP của bạn xuất các chuỗi UTF-8 cho trình duyệt của bạn. Trong HTML của bạn, bao gồm thẻ meta
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
09 trong thẻ trang ____ của bạn.

Thí dụ

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
11

đọc thêm

  • Hướng dẫn sử dụng PHP: Chức năng chuỗi đa
  • Php UTF-8 Cheatsheet
  • Stack Overflow: Những yếu tố nào làm cho php unicode không tương thích?
  • Stack Overflow: Thực tiễn tốt nhất trong PHP và MySQL với chuỗi quốc tế
  • Cách hỗ trợ toàn bộ Unicode trong cơ sở dữ liệu MySQL
  • Mã hóa hệ thống tập tin và PHP

Trở lại đầu trang

Làm việc với ngày và giờ

Sử dụng lớp db = $db; } //Some update and insert below here } class Employee { private $db; public function __construct(Database $db) { $this->db = $db; } //Some update and insert below here } ?> 12.

Trong những ngày xưa tồi tệ của PHP, chúng tôi phải làm việc với ngày và thời gian bằng cách sử dụng sự kết hợp hoang mang của

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
13,
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
14,
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
15,
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
16, v.v. Đáng buồn thay, bạn vẫn sẽ tìm thấy rất nhiều hướng dẫn trực tuyến với các chức năng khó khăn và lỗi thời này.

May mắn cho chúng tôi, phiên bản PHP mà chúng tôi nói về các tính năng của lớp

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
12 thân thiện hơn nhiều. Lớp này gói gọn tất cả các chức năng và nhiều chức năng ngày cũ hơn trong một lớp dễ sử dụng, với phần thưởng của việc chuyển đổi múi giờ đơn giản hơn nhiều. Luôn luôn sử dụng lớp
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
12 để tạo, so sánh, thay đổi và hiển thị ngày trong PHP.

Thí dụ

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
19

Gotchas

  • Nếu bạn không chỉ định múi giờ,

    db = $db;
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct(Database $db) {
            $this->db = $db;
        }
    
        //Some update and insert below here
    }
    ?>
    
    20 sẽ đặt múi giờ ngày kết quả thành múi giờ của máy tính mà bạn đang chạy. Điều này có thể dẫn đến những cơn đau đầu ngoạn mục sau này. Luôn chỉ định múi giờ UTC khi tạo ngày mới trừ khi bạn thực sự biết bạn đang làm gì.Always specify the UTC time zone when creating new dates unless you really know what you’re doing.

  • Nếu bạn sử dụng dấu thời gian UNIX trong

    db = $db;
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct(Database $db) {
            $this->db = $db;
        }
    
        //Some update and insert below here
    }
    ?>
    
    20, múi giờ sẽ luôn được đặt thành UTC bất kể bạn chỉ định gì trong đối số thứ hai.

  • Vượt qua ngày Zeroed (ví dụ: 0000-00-00, một giá trị thường được MySQL tạo ra là giá trị mặc định trong cột DateTime) đến

    db = $db;
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct(Database $db) {
            $this->db = $db;
        }
    
        //Some update and insert below here
    }
    ?>
    
    20 sẽ dẫn đến một ngày vô nghĩa, không phải là 0000-00-00-00.

  • Sử dụng

    db = $db;
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct(Database $db) {
            $this->db = $db;
        }
    
        //Some update and insert below here
    }
    ?>
    
    23 trên các hệ thống 32 bit sẽ không đại diện cho ngày qua 2038. Hệ thống 64 bit là OK.

Đọc thêm

  • Hướng dẫn sử dụng PHP: Lớp DateTime

  • Stack Overflow: Truy cập ngày vượt quá 2038

Trở lại đầu trang

Kiểm tra xem giá trị là null hay sai

Sử dụng toán tử db = $db; } //Some update and insert below here } class Employee { private $db; public function __construct(Database $db) { $this->db = $db; } //Some update and insert below here } ?> 24 để kiểm tra các giá trị sai của NULL và Boolean.

Hệ thống gõ lỏng của PHP cung cấp nhiều cách khác nhau để kiểm tra giá trị biến đổi. Tuy nhiên nó cũng trình bày rất nhiều vấn đề. Sử dụng

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
25 để kiểm tra xem giá trị là null hay false có thể trả về dương tính giả nếu giá trị thực sự là một chuỗi trống hay 0.
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
26 kiểm tra xem một biến có giá trị không phải là null hay không, nhưng không kiểm tra so với Boolean
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
27.

Hàm

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
28 kiểm tra chính xác nếu giá trị null và hàm
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
29 kiểm tra xem nó có giá trị boolean không (như
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
27), nhưng có một tùy chọn thậm chí còn tốt hơn: toán tử
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
24.
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
24 Kiểm tra xem các giá trị có giống hệt nhau hay không, không giống như tương đương trong thế giới được gõ lỏng lẻo của PHP. Nó cũng nhanh hơn một chút so với
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
28 và
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
29, và trông đẹp hơn so với sử dụng một hàm để so sánh.

Thí dụ

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
35

Gotchas

  • Khi kiểm tra giá trị trả về của hàm có thể trả về 0 hoặc boolean
    db = $db;
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct(Database $db) {
            $this->db = $db;
        }
    
        //Some update and insert below here
    }
    ?>
    
    27, như 4, luôn luôn sử dụng
    db = $db;
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct(Database $db) {
            $this->db = $db;
        }
    
        //Some update and insert below here
    }
    ?>
    
    24 và
    db = $db;
        }
    
        //Some update and insert below here
    }
    
    class Employee {
        private $db;
    
        public function __construct(Database $db) {
            $this->db = $db;
        }
    
        //Some update and insert below here
    }
    ?>
    
    39 hoặc bạn sẽ gặp các vấn đề.

đọc thêm

  • Hướng dẫn sử dụng PHP: Các toán tử so sánh
  • Stack Overflow: is_null () vs ===

Trở lại đầu trang

Kiểm tra xem giá trị là null hay sai

Sử dụng toán tử

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
24 để kiểm tra các giá trị sai của NULL và Boolean.

Hệ thống gõ lỏng của PHP cung cấp nhiều cách khác nhau để kiểm tra giá trị biến đổi. Tuy nhiên nó cũng trình bày rất nhiều vấn đề. Sử dụng

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
25 để kiểm tra xem giá trị là null hay false có thể trả về dương tính giả nếu giá trị thực sự là một chuỗi trống hay 0.
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
26 kiểm tra xem một biến có giá trị không phải là null hay không, nhưng không kiểm tra so với Boolean
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
27.

Hàm
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
28 kiểm tra chính xác nếu giá trị null và hàm
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
29 kiểm tra xem nó có giá trị boolean không (như
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
27), nhưng có một tùy chọn thậm chí còn tốt hơn: toán tử
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
24.
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
24 Kiểm tra xem các giá trị có giống hệt nhau hay không, không giống như tương đương trong thế giới được gõ lỏng lẻo của PHP. Nó cũng nhanh hơn một chút so với
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
28 và
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
29, và trông đẹp hơn so với sử dụng một hàm để so sánh.

Thí dụ

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
35

Trở lại đầu trang

Kiểm tra xem giá trị là null hay sai

Sử dụng toán tử

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
24 để kiểm tra các giá trị sai của NULL và Boolean.

Hệ thống gõ lỏng của PHP cung cấp nhiều cách khác nhau để kiểm tra giá trị biến đổi. Tuy nhiên nó cũng trình bày rất nhiều vấn đề. Sử dụng

db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
25 để kiểm tra xem giá trị là null hay false có thể trả về dương tính giả nếu giá trị thực sự là một chuỗi trống hay 0.
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
26 kiểm tra xem một biến có giá trị không phải là null hay không, nhưng không kiểm tra so với Boolean
db = $db;
    }

    //Some update and insert below here
}

class Employee {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    //Some update and insert below here
}
?>
27.

Trở lại đầu trang

Php được kết nối với cơ sở dữ liệu như thế nào?

Sử dụng các tiện ích mở rộng để kết nối cơ sở dữ liệu MySQL trong các ứng dụng PHP kết nối với MySQL (và MariaDB). Truy xuất thông tin máy chủ cơ sở dữ liệu. Quản lý các lỗi được tạo từ các cuộc gọi cơ sở dữ liệu. Làm việc với các bản ghi cơ sở dữ liệu bằng các hàm tạo, đọc, cập nhật và xóa (CRUD). Connect PHP applications with MySQL (and MariaDB). Retrieve database server information. Manage errors generated from database calls. Work with database records using the Create, Read, Update, and Delete (CRUD) functions.

Các tham số cần thiết cho kết nối DB từ PHP là gì?

Để tạo kết nối cơ sở dữ liệu trong PHP, hãy sử dụng hàm mysqli_connect ().Phải mất bốn đối số: tên máy chủ, tên người dùng, mật khẩu, tên cơ sở dữ liệu.server name, username, password, database name.

PHP có tốt cho cơ sở dữ liệu không?

PHP cho phép kết nối với hầu hết mọi loại cơ sở dữ liệu.Lựa chọn phổ biến nhất là MySQL, chủ yếu là vì nó miễn phí, hiệu quả và phổ biến đối với các nhà phát triển.Các tùy chọn vững chắc khác của các hệ thống quản lý cơ sở dữ liệu tương thích với PHP là MSQL, MS-SQL, SQLite, PostgreSQL, v.v.. The most common choice is MySQL, mainly because it is free, effective, and popular among developers. Other solid options of database management systems compatible with PHP are mSQL, MS-SQL, SQLite, PostgreSQL, etc.

Những nhược điểm của việc sử dụng kết nối liên tục trong PDO là gì?

Hạn chế lớn nhất đối với các kết nối liên tục là nó giới hạn số lượng người dùng bạn có thể duyệt trang web của mình: nếu MySQL được cấu hình để chỉ cho phép 10 kết nối đồng thời cùng một lúc khi người thứ 11 cố gắng duyệt trang web của bạn, nó sẽ không hoạt động cho họ.PDO không quản lý sự kiên trì.it limits the number of users you can have browsing your site: if MySQL is configured to only allow 10 concurrent connections at once then when an 11th person tries to browse your site it won't work for them. PDO does not manage the persistence.