PHP và Form

PHP và Form hướng dẫn lập trình PHP để xử lý các dữ liệu gửi lên từ form html. Cách nhận giá trị radio button, checkbox, file, mảng control…


PHP và Form


PHP và Form : tạo Form

Form là một vùng trong trong web được tạo ra để user nhập thông tin rồi gửi lên server cho php xử lý. Việc tạo form và xử lý dữ liệu form rất thường thực hiện trong lập trình web.

Ví dụ  tạo form để user nhập từ khóa , rồi gửi từ khóa lên server để bạn xử lý chọn ra các sản phẩm chứa từ khóa đó.

Website nào bạn cũng phải tạo nhiều form, như form đăng nhập, form đăng ký thành viên, form đổi pass… Nơi nào bạn muốn người dùng nhập vô thông tin gì đó để xử lý thì bạn phải tạo form

Tag form

Form được tạo ra bởi tag form, với 2 thuộc tính quan trọng là actionmethod. Action là địa chỉ trang web ở phía server mà form sẽ gửi dữ liệu lên. Còn method là cách mà form gửi dữ liệu lên server (get hoặc post).

<form action="xuly.php" method="POST" >
   //….
</form>

Nút submit trong form

Trong mỗi form, bạn tạo ít nhất 1 nút  submit (có nhiều cũng được) để gửi dữ liệu trong form lên trang web ở phía server.  Có 2 cách để bạn tạo nút submit , một là dùng tag button, hai là dùng tag input như ví dụ dưới. 

<form action="xuly.php" method="POST" >
    ...
    <button type="submit"> Lưu </button>
    <input type="submit" value="Lưu" >
</form>

Các control trong form

Trong mỗi form, bạn tạo các control để user nhập dữ liệu vào. Các control này được tạo ra bằng tag input, tag select, tag textarea. Mỗi control phải được đặt tên bằng thuộc tính name, thuộc tính type cho biết kiểu dữ liệu mà user phải nhập trong control.

<form action="xuly.php" method="POST">
    Email <input type="email" name="email"> <br>
    Pass: <input type="password" name="pass">  
    <button type="submit">Lưu </button>
</form>

Dữ liệu được gửi lên server

Khi user nhắp nút submit trong form, các giá trị trong form sẽ được gửi lên server theo dạng từng cặp  key=value, cách nhau bởi dấu & . Các giá trị này khi lên tới server sẽ nằm trong mảng $_POST

PHP và Form: xử lý dữ liệu gửi lên từ form

Xử lý dữ liệu từ Form gửi lên là 1 phần không thể thiếu trong lập trình động.  Sau khi đã tạo form xong, bạn cần thực hiện code để tiếp nhận dữ liệu gửi lên từ form. Đơn giản thôi, tạo trang web đã khai báo trong thuộc tính action của tag form . Dữ liệu form gửi lên nằm trong các các mảng có sẵn $_POST, $GET, $FILES, $_REQUEST .

  • Nếu method của tag form là post, thì dữ liệu mà form gửi lên nằm trong mảng $_POST. Còn mảng $_GET lúc này sẽ rỗng
  • Nếu method của tag form là get, thì dữ liệu mà form gửi lên nằm trong mảng $_GET. Còn mảng $_POST lúc này sẽ rỗng
  • Bạn có thể dùng mảng $_REQUEST cũng được, mảng này luôn chứa dữ liệu từ form gửi lên bất kể method của form là post hay get

Ví dụ tạo form và xử lý form trong php

<!-- form1.php -->
<form action="xuly.php" method="POST">
<p>Tên sp <input name="ten_sp" type="text"> </p>
  

<p>Giá sp<input name="gia" type="number"> </p> <p>Ngày <input name="ngay" type="date"> </p> <p>Ân hiện <input name="anhien" type="radio" value="0">Ẩn <input name="anhien" type="radio" value="1" Hiện </p> <p>Hot <input type="checkbox" name="noibat"></p> <p>Mô tả <textarea name="mota"></textarea> </p> <p>Hình<input type="file" name="hinh"> </p> <input type="hidden" name="token" value="x86hs"> <p><button type="submit">Lưu</button> </p> </form>
<!-- xuly.php -->
$_POST: <pre> <?php var_export($_POST); ?><hr> 
Tên sp: <?php echo $_POST['ten_sp'];?><br>
Giá sp: <?php echo $_POST['gia'];?><br>
Ngày: <?php echo $_POST['ngay'];?><br>
Ẩn hiện: <?php echo $_POST['anhien'];?><br>
Nổi bật: <?php echo $_POST['noibat'];?><br>

Form có sử dụng radio button

Nếu trong form của bạn có dùng radio button, có 2 lưu ý sau liên quan đến radio button.

a. Các radio button chung 1 nhóm phải có name giống nhau, mỗi radio phải có value khác nhau.  Ví dụ:

<form action="xuly2.php" method="POST">
    <p>Ân hiện 
        <input name="anhien" type="radio" value="0"> Ẩn
        <input name="anhien" type="radio" value="1"> Hiện 
    </p>
    <p>Ngôn ngữ 
        <input name="lang" type="radio" value="vi"> Tiếng Việt
        <input name="lang" type="radio" value="en"> English
        <input name="lang" type="radio" value="fr"> French
    </p>
    <button type="submit">Lưu </button>
</form>

b. Khi submit form, radio nào không được đánh dấu chọn thì sẽ không gửi lên server, còn nếu nó được chọn thì giá trị (thuộc tính value) của radio được chọn sẽ được gửi lên nằm trong $_POST / $_GET

Form có sử dụng checkbox

Nếu trong form của bạn có dùng checkbox, có 2 lưu ý sau liên quan đến radio button.

a. Chexbox trong form không cần khai báo thuộc tính value.

b. Khi submit, checkbox  nào không được đánh dấu chọn thì sẽ không gửi lên server, còn nếu nó được check thì giá trị 1 (true, on) sẽ được gửi lên nằm trong $_POST / $_GET . Muốn biết user có chọn mục nào thì dùng isset.  Ví dụ isset(  $_POST[‘chimhot’] ) => true

Form có sử dụng file

Nếu trong form của bạn có dùng đối tượng file để upload file thì có các lưu ý cần biết sau đây:

1. Tag form phải có thuộc tính method=”post” và thuộc tính enctype=”multipart/form-data” . Có 2 thuộc tính thế này thì trình duyệt mới upload file lên server.

2. Thông tin về file khi đưa lên server sẽ nằm trong mảng $_FILES chứ không phải nằm trong $_POST

3. Mỗi tag input có type là file là 1 phần tử trong $_FILES. gồm 6 thông tin sau:

  • name: tên file mà user đã chọn trong trình duyệt
  • full_path: đường dẫn của file
  • type: kiểu của file (theo quy định chuẩn về mime type trên internet)
  • tmp_name : đường dẫn của file tạm đã được lưu trên server
  • size: kích thước của file tính bằng byte
  • error: thông tin về lỗi

4. Giá trị của các control không phải là file thì được lưu trong $_POST  như bạn đã biết

<!-- form3.php -->
<form method="post" action="xuly3.php" enctype= 
"multipart/form-data" >
<p>Tên SP <input type="text" name="ten_sp"> </p>
<p>Giá SP <input type="number" name="gia"> </p>
<p>Hình : <input type="file" name="hinh"> </p>
<p> <button type="submit">Lưu</button> </p>
</form> 
<!-- xuly3.php --> <pre>
$_POST <?php var_export($_POST); ?><br>
$_FILES <?php var_export($_FILES['hinh']); ?>

5. Do file đã được lưu sẵn vào vị trí tạm trên server, cho nên bạn cần di chuyển file từ vị trí tạm vào folder đích mà bạn muốn bằng hàm move_uploaded_file. Hàm này có 2 tham số, tham số đầu tiên là địa chỉ file tạm, tham số thứ hai là địa chỉ mới mà bạn muốn di chuyển file đến (gồm folder đích và tên file )

<!-- xuly3.php -->
<?php
  $hinh = $_FILES['hinh'];
  move_uploaded_file($hinh['tmp_name'],"hinh/". $hinh['name'] );
  echo "Đã upload";
?>

Form có nhiều control giống tên (mảng các control trùng tên)

Bạn không thể tránh được có lúc sẽ đặt tên các controler giống  tên nhau, lý do là các control này được đặt trong vòng lặp.

<!-- form4.php -->
<?php $cart = [
 ['id_sp'=>3, 'ten_sp'=>'Dell X8T2', 'gia'=>12500000, 'soluong'=>3], 
 ['id_sp'=>7, 'ten_sp'=>'Acer T7C0 I3', 'gia'=>9500000, 'soluong'=>1], 
 ['id_sp'=>12, 'ten_sp'=>'HP I5 Gamming', 'gia'=>14500000, 'soluong'=>5], 
 ['id_sp'=>30, 'ten_sp'=>'MSI Y87XS', 'gia'=>10990000, 'soluong'=>2]
]; 
?>
<style>
  #cart { width: 600px; margin: auto; }
  #cart >div { display: grid; grid-template-columns: auto 120px 80px ; margin-bottom: -1px; }
  #cart >div > * { border: solid 1px darkcyan; padding: 5px;}
</style>
<form id="cart" action="xuly4.php" method="post">
    <?php foreach($cart as $c) { ?>
    <div> 
      <span> <?= $c['ten_sp']?> </span>
      <span> <?= $c['gia']?> </span>
      <input value="<?= $c['soluong']?>" name="soluong[]" type="number"> 
      <input value= "<?= $c['id_sp']?>" name="id_sp[]" type="hidden"> 
    </div>
    <?php } ?>
    <p> <button type="submit">Cập nhật</button> </p>
</form>

Khi các control được đặt trong vòng lặp, như ví du trên thì thêm phía sau tên dấu [ ] . Khi đó trình duyệt sẽ hiểu chúng là mảng các controler , và giá trị của chúng sẽ được trình duyệt đưa tất cả lên server khi submit.

Trên server, bạn tiếp nhận theo cú pháp  $_POST[‘soluong’]  (không cần dùng [ ] ở sau soluong) . Kết quả bạn có được là mảng các giá trị gửi lên từ client. Xem hình sau sẽ rõ. $_POST[‘soluong’] là mảng,  $_POST[‘id_sp’] cũng là mảng.

Câu chuyện về PHP và Form chưa hết đâu, mời em xem thêm các link này nhé: