Làm việc với form trong php

Làm việc với form trong php gồm các vấn đề: sử dụng $_GET, $_POST ; hiện lại giá trị ; kiểm tra dữ liệu và hiện lỗi ; xử lý file upload; ứng dụng của method get … Đậy là bài viết bổ trợ cho video ở cuối, các em hãy xem video trước nhé.


$_GET và $_POST

  • $_GET: là array trong PHP dùng để chứa các tham số trong url
  • $_POST: là array trong PHP dùng để chứa các giá trị trong form POST
  • Để xem cấu trúc 2 array này: dùng lệnh print_r. Ví dụ:
<?php  print_r($_POST);     // array ?>    
<?php  print_r($_GET);  //  ?>    
  • Lấy ra 1 giá trị trong $_GET, $_POST,  dùng $_POST[‘key’]  , $_GET[‘key’] . Ví dụ:
<?php  echo $_POST['tensp'] ;  //  ?>

Tạo form

a. Tạo trang formThemSP.php và code:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
<div class="m-auto border border-secondary p-2" style="width:800px">
<form method="post" class="row" enctype='multipart/form-data' >
    <div class="mb-3 col-6">
        <label for="tensp" class="form-label">Tên SP</label>
        <input  id="tensp" name="tensp" type="text" class="form-control">
    </div>
    <div class="mb-3 col-6">
        <label for="gia" class="form-label">Giá</label>
        <input  id="gia" name="gia" type="number" class="form-control">
    </div>
    <div class="mb-3 col-6">
        <label for="hinh" class="form-label">Hình</label>
        <input id="hinh" name="hinh" type="file" class="form-control" >    
    </div>
    <div class="mb-3 col-6">
        <label for="ngay" class="form-label">Ngày nhập</label>
        <input id="ngay" name="ngay" type="date" class="form-control" >    
    </div>
    <div class="mb-3 col-6">
        <label for="loaisp" class="form-label">Loại sản phẩm</label>
        <select id="loaisp" name="loaisp" class="form-select" >
            <option selected> Sách lịch sử </option>
            <option value="1">Văn học </option>
            <option value="2">Nghệ thuật sống</option>
            <option value="3">Học làm người</option>
        </select>
    </div>
    <div class="mb-3 col-6">
        <label class="form-label">Ẩn hiện</label>
        <div class="form-control">
            <div class="form-check form-check-inline">
                <input name="anhien" id="hien" value="1" class="form-check-input" type="radio">
                <label class="form-check-label" for="hien">Hiện</label>
            </div>
            <div class="form-check form-check-inline">
                <input name="anhien" id="an" value="0" class="form-check-input" type="radio" >
                <label class="form-check-label" for="an">Ẩn</label>
            </div>
        </div>
    </div>
  <div class="mb-3">    
    <textarea id="mota" name="mota" rows="4" placeholder="Mô tả" class="form-control"></textarea>
  </div>
   <div class="text-center">
       <button name="btnLuu" type="submit" class="btn btn-primary py-1 px-5">Lưu dữ liệu</button>
       <button type="reset" class="btn btn-danger py-1 px-5">Xóa làm lại</button>
  </div>
</form>
</div>

Lấy dữ liệu khi submit

<?php 
if  (isset($_POST['btnLuu'])==true) {
    //nếu cần thì xem data trong $_POST với lệnh print_r($_POST);
    //$tenbiến = $_POST['nameCủaControlTrongForm']; 
    //kiểm tra tính đúng đắn của dữ liệu
    //nếu dữ liệu ok thì kết nối db , lấy data hoặc lưu ...
    //chuyển hướng sang trang khác niếu cần với header("location:...);
    //thoát với lệnh exit();

    $tensp = $_POST['tensp'];
    $gia = $_POST['gia'];
    $hinh = $_POST['hinh'];
}
?>

Hiện lại giá trị trong form

  • Khi submit, trang web sẽ nạp lại, dẫn đến các giá trị user đã gõ trong các control sẽ bị mất. cho nên cần phải hiện lại.
  • Hiện  giá trị cho các control trong form bằng cách gán giá trị trong thuộc tính value . Ví dụ:
<input value="<?php if (isset($tensp)) echo $tensp?>"  id="tensp" name="tensp" type="text" class="form-control">

Hiện các lỗi

  • Việc kiểm tra dữ liệu trong form có thể có một số lỗi cần thông báo
<?php 
$loi="";
if  (isset($_POST['btnLuu'])==true) {
    $tensp = $_POST['tensp'];
    $gia = $_POST['gia'];
    …
    if (strlen($tensp)==0)  $loi.="Tên sản phẩm chưa nhập <br/>";
    if (strlen($tensp)>20)  $loi.="Tên sản phẩm dài quá<br/>";
    if (strlen($gia)<0)  $loi.="Giá phải >0<br/>"; 
     …

Để hiện lỗi, ở đầu form nếu thấy biến lỗi có giá trị thì hiện ra

  <?php if ($loi!="") { ?>
    <div class="alert alert-danger"><?php echo $loi?></div>
  <?php } ?>

Xử lý dữ liệu kiểu file

Nhận thông tin của file qua $_FILES[‘nameCủaControl’].  Ví dụ

$h = $_FILES['hinh'];

// $h = Array ( [name] => bg cam.jpg [type] => image/jpeg [tmp_name] => E:\xampp\tmp\phpC11.tmp [error] => 0 [size] => 29342 )

$h là mảng gồm 5 phần tử : name, size, type , tmp_name , error. Trong đó

  • name:là tên của file hình mà user đã submit
  • size: kích thước của file
  • type: kiểu data trong file được submit
  • tmp_name: đường path file đã được lưu trong folder tmp
  • error: cho biết có lỗi không.

Lưu file submit bằng cách di chuyển từ vị trí lưu tạm đến chỗ mới bằng lệnh move_uploaded_file($tmp_name, $newPath);

 $tmp_name= $h['tmp_name'];
 $name= $h['name'];    
 $newPath="khoMedia/" . $name;
 move_uploaded_file($tmp_name, $newPath);

Xử lý submit ở file khác

Địa chỉ file khác khai báo trong thuộc tính action của form

Form có method là GET

  • Ít khi dùng hơn post
  • Chỉ dùng method get khi thật sự cần , đó là khi cần đưa các biến trong form lên địa chỉ giúp user mà không cần user nhập các biến
  • Ví dụ 1: trang tin trong loại với tham số idLT. => Chọn trong select  1 loại tin rồi submit để hiện tin trong loại

demoGET1.php

<?php 
  $idLT=0;
  if (isset($_GET['idLT'])==true) $idLT = $_GET['idLT']; 
  $conn = new PDO("mysql:host=localhost;dbname=thaylongweb_tintuc;charset=utf8", "root", "");     
  $sql="SELECT idTin, TieuDe, TomTat, Ngay, SoLanXem FROM tin WHERE idLT = $idLT";
  $data = $conn->query($sql);
?>
<?php foreach ($data as $index=> $row) {?>
    <div class="tin"> 
        <h4> <?=$index+1?> <a href="#"> <?=$row['TieuDe'];?></a></h4>
        <i> Đăng: <?=date("d/m/Y",strtotime($row['Ngay']))?> - 
            Xem <?=$row['SoLanXem']?> </i>
        <p> <?=$row['TomTat']?> </p>
    </div>
<?php } ?>

Hiện form loại tin

<?php $loaitin = $conn->query("SELECT idLT, Ten  FROM loaitin");?>
<form method="get">
    <select name="idLT">
        <?php foreach ($loaitin as $row) { ?>        
            <option value="<?=$row['idLT']?>"><?=$row['Ten']?></option>
        <?php } ?>
    </select>
    <button type="submit">Xem </button>
</form>

Ví dụ 2: có trang tin theo từ khóa với tham số tukhoa. è gõ từ khóa trong form rồi submit để hiện tin chứa từ khóa (bài toán tìm kiếm)

demoGET2.php

<?php 
$tukhoa=0;
if (isset($_GET['tukhoa'])==true) $tukhoa = $_GET['tukhoa']; 
$conn = new PDO("mysql:host=localhost;dbname=thaylongweb_tintuc;charset=utf8", "root", "");     
$sql="SELECT idTin, TieuDe, TomTat, Ngay, SoLanXem FROM tin WHERE TieuDe like '%$tukhoa%'";
$data = $conn->query($sql);
?>
<?php foreach ($data as $index=> $row) {?>
    <div class="tin"> 
        <h4> <?=$index+1?> <a href="#"> <?=$row['TieuDe'];?></a></h4>
        <i> Đăng: <?=date("d/m/Y",strtotime($row['Ngay']))?> - 
            Xem <?=$row['SoLanXem']?> </i>
        <p> <?=$row['TomTat']?> </p>
    </div>
<?php } ?>

Form tìm kiếm với method get được dùng để đưa từ khóa lên url

<form method="get">
    <input type="text" name="tukhoa" placeholder="Từ khóa"> 
    <button type="submit">Xem </button>
</form>

Database thaylongweb_tintuc


Các vấn đề khi làm việc với form trong php cơ bản như trình bày ở trên, vẫn còn một vài đấn đề khác thầy sẽ trình bày sau.

Chi tiết các hướng dẫn ở trên mời em xem video nhé.