Thực thi () làm gì trong php?

Ý tưởng về trình biên dịch là gì dường như là một chủ đề gây ra sự nhầm lẫn lớn. Một số người cho rằng trình biên dịch là chương trình chuyển đổi mã nguồn trong một ngôn ngữ thành chương trình thực thi được. Định nghĩa về trình biên dịch thực sự rộng hơn thế

Trình biên dịch là một chương trình biến đổi mã nguồn thành một biểu diễn khác của mã. Biểu diễn mục tiêu thường là mã máy, nhưng nó cũng có thể là mã nguồn bằng ngôn ngữ khác hoặc thậm chí bằng cùng một ngôn ngữ

PHP trở thành ngôn ngữ biên dịch vào năm 2000, khi PHP 4 được phát hành lần đầu tiên. Cho đến phiên bản 3, mã nguồn PHP đã được phân tích cú pháp và thực thi ngay lập tức bởi trình thông dịch PHP

PHP 4 đã giới thiệu công cụ Zend. Công cụ này chia quá trình xử lý mã PHP thành nhiều giai đoạn. Giai đoạn đầu tiên phân tích cú pháp mã nguồn PHP và tạo ra một biểu diễn nhị phân của mã PHP được gọi là Zend opcodes. Opcodes là tập hợp các hướng dẫn tương tự như Java bytecodes. Các opcode này được lưu trữ trong bộ nhớ. Giai đoạn thứ hai của quá trình xử lý công cụ Zend bao gồm thực thi các opcode được tạo

Hàm shell_exec() là một hàm sẵn có trong PHP, được sử dụng để thực thi các lệnh thông qua shell và trả về đầu ra hoàn chỉnh dưới dạng một chuỗi. Shell_exec là bí danh của toán tử backtick, dành cho những toán tử đã sử dụng *nix. Nếu lệnh không thành công, trả về NULL và các giá trị không đáng tin cậy để kiểm tra lỗi

cú pháp

string shell_exec( $cmd )

Thông số. Hàm này chấp nhận một tham số $cmd được sử dụng để giữ lệnh sẽ được thực thi

Giá trị trả về. Hàm này trả về lệnh đã thực hiện hoặc NULL nếu xảy ra lỗi

Ghi chú. Chức năng này bị tắt khi PHP đang chạy ở chế độ an toàn

Thí dụ




 

// Use ls command to shell_exec

// function

$output = shell_exec(

gfg.php
index.html
geeks.php
0
gfg.php
index.html
geeks.php
1

 

gfg.php
index.html
geeks.php
3

gfg.php
index.html
geeks.php
4

gfg.php
index.html
geeks.php
5
gfg.php
index.html
geeks.php
6_______1_______7

gfg.php
index.html
geeks.php
8

đầu ra

gfg.php
index.html
geeks.php

hàm exec()

Hàm exec() là một hàm sẵn có trong PHP, được sử dụng để thực thi một chương trình bên ngoài và trả về dòng cuối cùng của kết quả. Nó cũng trả về NULL nếu không có lệnh nào chạy đúng

cú pháp

string exec( $command, $output, $return_var )

Thông số. Hàm này chấp nhận ba tham số như đã đề cập ở trên và được mô tả bên dưới

  • lệnh $. Tham số này được sử dụng để giữ lệnh sẽ được thực thi
  • đầu ra $. Tham số này được sử dụng để chỉ định mảng sẽ được lấp đầy với mọi dòng đầu ra từ lệnh
  • $return_var. Tham số $return_var xuất hiện cùng với đối số đầu ra, sau đó nó trả về trạng thái của lệnh được thực thi sẽ được ghi vào biến này

Giá trị trả về. Hàm này trả về lệnh đã thực hiện, đảm bảo đặt và sử dụng tham số đầu ra

Thí dụ




string exec( $command, $output, $return_var )
0

gfg.php
index.html
geeks.php
5
string exec( $command, $output, $return_var )
2_______10_______3
string exec( $command, $output, $return_var )
4_______1_______1

gfg.php
index.html
geeks.php
8

đầu ra

geeks.php

Người giới thiệu

  • http. //php. net/thủ công/vi/chức năng. shell-exec. php
  • http. //php. net/thủ công/vi/chức năng. giám đốc điều hành. php

PHP là ngôn ngữ kịch bản phía máy chủ được thiết kế dành riêng cho phát triển web. Bạn có thể học PHP từ đầu bằng cách làm theo Hướng dẫn PHP và Ví dụ về PHP này

Cơ sở dữ liệu MySQL hỗ trợ các câu lệnh đã chuẩn bị. Một câu lệnh đã chuẩn bị hoặc một câu lệnh được tham số hóa được sử dụng để thực thi cùng một câu lệnh lặp đi lặp lại với hiệu quả cao và bảo vệ chống lại việc tiêm SQL

quy trình làm việc cơ bản

Việc thực hiện câu lệnh chuẩn bị bao gồm hai giai đoạn. chuẩn bị và thực hiện. Ở giai đoạn chuẩn bị, một mẫu câu lệnh được gửi đến máy chủ cơ sở dữ liệu. Máy chủ thực hiện kiểm tra cú pháp và khởi tạo tài nguyên nội bộ của máy chủ để sử dụng sau này

Máy chủ MySQL hỗ trợ sử dụng trình giữ chỗ ẩn danh, có vị trí với ?

Chuẩn bị được theo sau bởi thực hiện. Trong quá trình thực thi, máy khách liên kết các giá trị tham số và gửi chúng đến máy chủ. Máy chủ thực thi câu lệnh với các giá trị ràng buộc bằng cách sử dụng tài nguyên nội bộ đã tạo trước đó

Ví dụ #1 Tuyên bố đã chuẩn bị

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

/* Non-prepared statement */
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label TEXT)");

/* Prepared statement, stage 1: prepare */
$stmt = $mysqli->prepare("INSERT INTO test(id, label) VALUES (?, ?)");

/* Prepared statement, stage 2: bind and execute */
$id = 1;
$label = 'PHP';
$stmt->bind_param("is", $id, $label); // "is" means that $id is bound as an integer and $label as a string

id = 1 (integer)
label = PHP (string)
0

Thực hiện lặp đi lặp lại

Một câu lệnh chuẩn bị có thể được thực hiện nhiều lần. Sau mỗi lần thực hiện, giá trị hiện tại của biến bị ràng buộc được đánh giá và gửi đến máy chủ. Tuyên bố không được phân tích cú pháp một lần nữa. Mẫu sao kê không được chuyển lại máy chủ

Ví dụ #2 INSERT chuẩn bị một lần, thực hiện nhiều lần

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

/* Non-prepared statement */
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label TEXT)");

/* Prepared statement, stage 1: prepare */
$stmt = $mysqli->prepare("INSERT INTO test(id, label) VALUES (?, ?)");

id = 1 (integer)
label = PHP (string)
4

id = 1 (integer)
label = PHP (string)
5

id = 1 (integer)
label = PHP (string)
6

Ví dụ trên sẽ xuất ra

array(3) {
  [0]=>
  array(2) {
    ["id"]=>
    string(1) "1"
    ["label"]=>
    string(3) "PHP"
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(1) "2"
    ["label"]=>
    string(4) "Java"
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(1) "3"
    ["label"]=>
    string(3) "C++"
  }
}

Mọi câu lệnh đã chuẩn bị đều chiếm tài nguyên máy chủ. Các câu lệnh nên được đóng lại một cách rõ ràng ngay sau khi sử dụng. Nếu không được thực hiện một cách rõ ràng, câu lệnh sẽ bị đóng khi xử lý câu lệnh được giải phóng bởi PHP

Sử dụng một câu lệnh đã chuẩn bị không phải lúc nào cũng là cách hiệu quả nhất để thực hiện một câu lệnh. Một câu lệnh đã chuẩn bị được thực hiện chỉ một lần gây ra nhiều chuyến đi khứ hồi giữa máy khách và máy chủ hơn so với câu lệnh không được chuẩn bị. Đây là lý do tại sao

id = 1 (integer)
label = PHP (string)
7 không chạy như một câu lệnh chuẩn bị ở trên

Ngoài ra, hãy xem xét việc sử dụng cú pháp SQL multi-INSERT của MySQL cho INSERT. Ví dụ: multi-INSERT yêu cầu ít lượt đi lại giữa máy chủ và máy khách hơn so với câu lệnh đã chuẩn bị được hiển thị ở trên

Ví dụ #3 Ít vòng lặp hơn bằng cách sử dụng multi-INSERT SQL

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

id = 1 (integer)
label = PHP (string)
9

id = 1 (integer), label = PHP (string)
0

id = 1 (integer), label = PHP (string)
1

Loại dữ liệu giá trị tập hợp kết quả

Giao thức máy chủ máy khách MySQL xác định một giao thức truyền dữ liệu khác cho các câu lệnh đã chuẩn bị và các câu lệnh chưa chuẩn bị. Các câu lệnh đã chuẩn bị đang sử dụng cái gọi là giao thức nhị phân. Máy chủ MySQL gửi dữ liệu tập kết quả "nguyên trạng" ở định dạng nhị phân. Kết quả không được đánh số thứ tự thành chuỗi trước khi gửi. Thư viện máy khách nhận dữ liệu nhị phân và cố gắng chuyển đổi các giá trị thành các kiểu dữ liệu PHP thích hợp. Ví dụ: kết quả từ cột SQL

id = 1 (integer), label = PHP (string)
2 sẽ được cung cấp dưới dạng biến số nguyên PHP

Ví dụ #4 Kiểu dữ liệu gốc

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

id = 1 (integer), label = PHP (string)
4

id = 1 (integer), label = PHP (string)
5

id = 1 (integer), label = PHP (string)
6

Ví dụ trên sẽ xuất ra

id = 1 (integer)
label = PHP (string)

Hành vi này khác với tuyên bố không chuẩn bị. Theo mặc định, các câu lệnh không chuẩn bị trả về tất cả các kết quả dưới dạng chuỗi. Mặc định này có thể được thay đổi bằng tùy chọn kết nối. Nếu tùy chọn kết nối được sử dụng, không có sự khác biệt

Tìm nạp kết quả bằng các biến ràng buộc

Kết quả từ các câu lệnh đã chuẩn bị có thể được truy xuất bằng cách liên kết các biến đầu ra hoặc bằng cách yêu cầu một đối tượng mysqli_result

Các biến đầu ra phải được ràng buộc sau khi thực hiện câu lệnh. Một biến phải được ràng buộc cho mỗi cột của tập hợp kết quả câu lệnh

Ví dụ #5 Liên kết biến đầu ra

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

id = 1 (integer), label = PHP (string)
4

id = 1 (integer), label = PHP (string)
9

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}
0

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}
1

Ví dụ trên sẽ xuất ra

id = 1 (integer), label = PHP (string)

Các câu lệnh đã chuẩn bị trả về các tập kết quả không có bộ đệm theo mặc định. Kết quả của câu lệnh không được tìm nạp và chuyển hoàn toàn từ máy chủ sang máy khách để tạo bộ đệm phía máy khách. Tập kết quả lấy tài nguyên máy chủ cho đến khi tất cả các kết quả được máy khách tìm nạp. Vì vậy nên sử dụng kết quả kịp thời. Nếu ứng dụng khách không thể tìm nạp tất cả kết quả hoặc ứng dụng khách đóng câu lệnh trước khi tìm nạp tất cả dữ liệu, thì dữ liệu phải được tìm nạp hoàn toàn trước

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}
2

Cũng có thể đệm kết quả của câu lệnh đã chuẩn bị bằng cách sử dụng mysqli_stmt. store_result()

Tìm nạp kết quả bằng giao diện mysqli_result

Thay vì sử dụng kết quả bị ràng buộc, kết quả cũng có thể được truy xuất thông qua giao diện mysqli_result. mysqli_stmt. get_result() trả về tập kết quả được đệm

Ví dụ #6 Sử dụng mysqli_result để lấy kết quả

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

id = 1 (integer), label = PHP (string)
4

id = 1 (integer), label = PHP (string)
9

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}
6

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}
7

Ví dụ trên sẽ xuất ra

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}

Sử dụng giao diện mysqli_result mang lại lợi ích bổ sung cho việc điều hướng tập hợp kết quả phía máy khách linh hoạt

Ví dụ #7 Bộ đệm kết quả được đặt để đọc linh hoạt

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}
9

array(2) {
  ["id"]=>
  int(3)
  ["label"]=>
  string(3) "C++"
}
array(2) {
  ["id"]=>
  int(2)
  ["label"]=>
  string(4) "Java"
}
array(2) {
  ["id"]=>
  int(1)
  ["label"]=>
  string(3) "PHP"
}
0

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}
6

array(2) {
  ["id"]=>
  int(3)
  ["label"]=>
  string(3) "C++"
}
array(2) {
  ["id"]=>
  int(2)
  ["label"]=>
  string(4) "Java"
}
array(2) {
  ["id"]=>
  int(1)
  ["label"]=>
  string(3) "PHP"
}
2

Ví dụ trên sẽ xuất ra

array(2) {
  ["id"]=>
  int(3)
  ["label"]=>
  string(3) "C++"
}
array(2) {
  ["id"]=>
  int(2)
  ["label"]=>
  string(4) "Java"
}
array(2) {
  ["id"]=>
  int(1)
  ["label"]=>
  string(3) "PHP"
}

Thoát và tiêm SQL

Các biến giới hạn được gửi đến máy chủ riêng biệt với truy vấn và do đó không thể can thiệp vào nó. Máy chủ sử dụng các giá trị này trực tiếp tại thời điểm thực thi, sau khi mẫu câu lệnh được phân tích cú pháp. Các tham số giới hạn không cần phải thoát vì chúng không bao giờ được thay thế trực tiếp vào chuỗi truy vấn. Một gợi ý phải được cung cấp cho máy chủ về loại biến bị ràng buộc, để tạo một chuyển đổi thích hợp. Xem mysqli_stmt. bind_param() để biết thêm thông tin

Sự tách biệt như vậy đôi khi được coi là tính năng bảo mật duy nhất để ngăn chặn SQL injection, nhưng mức độ bảo mật tương tự có thể đạt được với các câu lệnh không chuẩn bị, nếu tất cả các giá trị được định dạng chính xác. Cần lưu ý rằng định dạng chính xác không giống như thoát và liên quan đến logic hơn so với thoát đơn giản. Do đó, các câu lệnh đã chuẩn bị chỉ đơn giản là một cách tiếp cận thuận tiện hơn và ít bị lỗi hơn đối với yếu tố bảo mật cơ sở dữ liệu này

Thực thi () trả về gì trong PHP?

Trả về đúng khi thành công hoặc sai khi thất bại .

exec() trong PDO là gì?

PDO. exec() trả về số hàng đã bị sửa đổi hoặc xóa bởi câu lệnh SQL mà bạn đưa ra . Nếu không có hàng nào bị ảnh hưởng, PDO. exec() trả về 0. Hàm này có thể trả về giá trị Boolean false nhưng cũng có thể trả về giá trị không phải Boolean được đánh giá là false. Vui lòng đọc phần về Booleans để biết thêm thông tin.

Làm cách nào để thực hiện truy vấn đơn giản trong PHP?

Trong mọi trường hợp, hàm PHP để thực hiện truy vấn là mysql_query(). $result = mysql_query($query); Đối với các truy vấn đơn giản như CHÈN, CẬP NHẬT, XÓA, v.v. (không trả về bản ghi), biến $result sẽ là TRUE hoặc FALSE dựa trên việc thực hiện thành công truy vấn trên cơ sở dữ liệu.

Việc sử dụng chuẩn bị () trong PHP là gì?

Hàm chuẩn bị() / mysqli_prepare() được sử dụng để chuẩn bị thực thi câu lệnh SQL .