JRadioButton, ButtonGroup và sự kiện isSelected – Ôn Tập 4

I. Phân tích giao diện

Nhìn vào giao diện trên chúng ta thấy nó chia thành 4 dòng và chỉ có duy nhất 1 cột do đó sử dụng Gridlayout.

II. Viết code


 

package ChooseColor;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class ChooseColor extends JFrame implements ActionListener{

JRadioButton jrdoRed,jrdoBlue,jrdoGreen,jrdoBlack;
ButtonGroup btnGroup;
JPanel jpnBottom;
JLabel jlbText;

public ChooseColor() {
super("Choose Color");
setLayout(new GridLayout(5,1));
setLocationRelativeTo(null);
setSize(200,250);
setDefaultCloseOperation(EXIT_ON_CLOSE);


btnGroup=new ButtonGroup();

jrdoRed=new JRadioButton("Red");
jrdoBlue=new JRadioButton("Blue");
jrdoGreen=new JRadioButton("Green");
jrdoBlack=new JRadioButton("Black");

jpnBottom=new JPanel();
jpnBottom.setBackground(Color.RED);

jlbText=new JLabel("Red is Selected");
jlbText.setForeground(Color.WHITE);

jpnBottom.add(jlbText);

//Thêm các JRadioButton vào ButtonGroup để chỉ duy nhất 1 JRadioButton được chọn
btnGroup.add(jrdoRed);
btnGroup.add(jrdoBlue);
btnGroup.add(jrdoGreen);
btnGroup.add(jrdoBlack);

add(jrdoRed);
add(jrdoBlue);
add(jrdoGreen);
add(jrdoBlack);

jrdoRed.setSelected(true);

add(jpnBottom);

jrdoRed.addActionListener(this);
jrdoBlue.addActionListener(this);
jrdoGreen.addActionListener(this);
jrdoBlack.addActionListener(this);



setVisible(true);
}
public static void main(String[] args) {
new ChooseColor();
}

@Override
public void actionPerformed(ActionEvent ae) {
if(jrdoRed.isSelected())
{
jpnBottom.setBackground(Color.RED);
jlbText.setText("Red is Selected");
}
else if(jrdoGreen.isSelected())
{
jpnBottom.setBackground(Color.GREEN);
jlbText.setText("Green is Selected");
}
else if(jrdoBlue.isSelected())
{
jpnBottom.setBackground(Color.BLUE);
jlbText.setText("Blue is Selected");
}
else
{
jpnBottom.setBackground(Color.BLACK);
jlbText.setText("Black is Selected");
}
}
}

 

Calculator đơn giản – Ôn Tập 3

I. Phân tích Layout

Nhìn vào hình trên thì chúng ta sẽ phân tích Layout như sau:

II. Viết code

Code tham khảo:



package EasyCalculator;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Calculator extends JFrame implements ActionListener {

          JPanel jpnX, jpnY, jpnButton, jpnResult;

          JLabel jlbX, jlbY, jlbResult;
          JTextField jtxtX, jtxtY;

           JButton jbtnPlus, jbtnSub, jbtnMul, jbtnDiv;

          public Calculator() {
               super("Calculator");
               setLayout(new GridLayout(4, 1));
               setSize(400, 160);
               setLocationRelativeTo(null);
               setDefaultCloseOperation(EXIT_ON_CLOSE);

               jlbX = new JLabel(" X= ");
               jlbY = new JLabel(" Y= ");
               jlbResult = new JLabel("Result");
               jlbResult.setForeground(Color.RED);

               jtxtX = new JTextField();
               jtxtY = new JTextField();

               jbtnPlus = new JButton("+");
               jbtnSub = new JButton("-");
               jbtnMul = new JButton("*");
               jbtnDiv = new JButton("/");

               jpnX = new JPanel(new BorderLayout());
               jpnY = new JPanel(new BorderLayout());
               jpnButton = new JPanel(new GridLayout(1, 4));
               jpnResult = new JPanel(new FlowLayout());

               jpnX.add(jlbX, BorderLayout.WEST);
               jpnX.add(jtxtX, BorderLayout.CENTER);

               jpnY.add(jlbY, BorderLayout.WEST);
               jpnY.add(jtxtY, BorderLayout.CENTER);

               jpnButton.add(jbtnPlus);
               jpnButton.add(jbtnSub);
               jpnButton.add(jbtnMul);
               jpnButton.add(jbtnDiv);

               jpnResult.add(jlbResult);

               add(jpnX);
               add(jpnY);
               add(jpnButton);

               add(jpnResult);

               jbtnPlus.addActionListener(this);
               jbtnSub.addActionListener(this);
               jbtnMul.addActionListener(this);
               jbtnDiv.addActionListener(this);

               setVisible(true);
}

public static void main(String[] args) {
       new Calculator();
}

@Override
public void actionPerformed(ActionEvent ae) {
      Double rs = 0.0;
try {
      if (ae.getSource() == jbtnPlus) {
      rs = Double.parseDouble(jtxtX.getText()) + Double.parseDouble(jtxtY.getText());
      jlbResult.setText("x+y="+rs.toString());
} else if (ae.getSource() == jbtnSub) {
      rs = Double.parseDouble(jtxtX.getText()) - Double.parseDouble(jtxtY.getText());
      jlbResult.setText("x-y="+rs.toString());
} else if (ae.getSource() == jbtnMul) {
      rs = Double.parseDouble(jtxtX.getText()) * Double.parseDouble(jtxtY.getText());
      jlbResult.setText("x*y="+rs.toString());
} else if (ae.getSource() == jbtnDiv) {
      rs = Double.parseDouble(jtxtX.getText()) / Double.parseDouble(jtxtY.getText());
      jlbResult.setText("x/y="+rs.toString());
}
} catch (NumberFormatException ex) {
       jlbResult.setText("");
       JOptionPane.showMessageDialog(null, ex, "Error", JOptionPane.ERROR_MESSAGE);
}
   }

}

Java-Swing Các Loại Layout – Ôn Tập 2

I.FlowLayout

FloawLayout là layout mà nó sẽ tự động sắp xếp các control trong form theo thứ tự được thêm vào, nếu có một control trên vào thì các control đó sẽ được sắp xếp trôi ra giữa layout. FlowLayout là layout mặc định nếu không được thiết lập thuộc tính setLayout.

Code tham khảo :


package Layout;

import javax.swing.*;

public class MyFlowLayout extends JFrame{

         //Khai báo component
         JButton jbtn1,jbtn2,jbtn3;
         JPanel jpnTop;

          public MyFlowLayout() {
                  super("FlowLayout");
                  setSize(300,400);
                 //Canh form giữa màn hình
                 setLocationRelativeTo(null);
                 //Thiết lập tắt hẳn chương trình khi ấn vào nút X
                 setDefaultCloseOperation(EXIT_ON_CLOSE);

                 //Khởi tạo component
                 jbtn1=new JButton("Button 1");
                 jbtn2=new JButton("Button 2");
                 jbtn3=new JButton("Button 3");

                 jpnTop=new JPanel();

                 //Thêm component

                 jpnTop.add(jbtn1);
                 jpnTop.add(jbtn2);
                 jpnTop.add(jbtn3);

                 add(jpnTop);

                 //thiết lập hiển thị
                 setVisible(true);
}

public static void main(String[] args) {
              new MyFlowLayout();
   }
}

II.BorderLayout

BorderLayout là loại layout chia ra làm 5 phần, phần phía bắc (North), phần chính giữa (Center), phần phía nam (South), phần phía tây (West), và phần phía đông (East).

Code tham khảo :


package Layout;

import java.awt.BorderLayout;
import javax.swing.*;


public class MyBorderLayout extends JFrame{

        //Khai báo component
        JButton jbtnNorth,jbtnCenter,jbtnSouth,jbtnWest,jbtnEast;

        public MyBorderLayout() {
               super("BorderLayout");
               //Thiết lập layout
               setLayout(new BorderLayout());
               setSize(400,400);
               //Canh form giữa màn hình
               setLocationRelativeTo(null);
               //Thiết lập tắt hẳn chương trình khi ấn vào nút X
               setDefaultCloseOperation(EXIT_ON_CLOSE);

               //Khởi tạo component
               jbtnNorth=new JButton("North");
               jbtnCenter=new JButton("Center");
               jbtnSouth=new JButton("South");
               jbtnWest=new JButton("West");
               jbtnEast=new JButton("East");
               
               //Thêm component
               add(jbtnNorth,BorderLayout.NORTH);
               add(jbtnCenter,BorderLayout.CENTER);
               add(jbtnSouth,BorderLayout.SOUTH);
               add(jbtnWest,BorderLayout.WEST);
               add(jbtnEast,BorderLayout.EAST);

               //thiết lập hiển thị
              setVisible(true);
}

public static void main(String[] args) {
        new MyBorderLayout();
   }

}

III.GridLayout

GridLayout là loại layout mà chia thành các dòng và các cột hình bên dưới chia gridlayout thành 3 dòng và 3 cột.

Code tham khảo:


package Layout;

import java.awt.GridLayout;
import javax.swing.*;


public class MyGridLayout extends JFrame{

     //Khai báo component
     JButton jbtn1,jbtn2,jbtn3,jbtn4,jbtn5,jbtn6,jbtn7,jbtn8,jbtn9;

     public MyGridLayout() {
            super("GridLayout");
            //Thiết lập layout
            //Gridlayout với 3 dòng 3 cột
            setLayout(new GridLayout(3,3));
            setSize(300,400);
            //Canh form giữa màn hình
            setLocationRelativeTo(null);
            //Thiết lập tắt hẳn chương trình khi ấn vào nút X
            setDefaultCloseOperation(EXIT_ON_CLOSE);

            //Khởi tạo component
            jbtn1=new JButton("1");
            jbtn2=new JButton("2");
            jbtn3=new JButton("3");
            jbtn4=new JButton("4");
            jbtn5=new JButton("5");
            jbtn6=new JButton("6");
            jbtn7=new JButton("7");
            jbtn8=new JButton("8");
            jbtn9=new JButton("9");

            //Thêm component
            add(jbtn1);
            add(jbtn2);
            add(jbtn3);
            add(jbtn4);
            add(jbtn5);
            add(jbtn6);
            add(jbtn7);
            add(jbtn8);
            add(jbtn9);


            //thiết lập hiển thị
           setVisible(true);
}

public static void main(String[] args) {
         new MyGridLayout();
    }
}

IV. Xây dựng giao diện

Nhìn vào giao diện trên chúng ta có được phân tích như sau:

Code tham khảo:


package MicrowaveOven;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;


public class MicrowaveOven extends JFrame {

        //Khai báo JPanel
        JPanel jpnRight,jpnButton;

        //Khai báo Component
        JTextField jtxtTime;
        JButton jbtnFood, jbtn1, jbtn2, jbtn3, jbtn4, jbtn5, jbtn6, jbtn7, jbtn8, jbtn9, jbtn0, jbtnStart, jbtnStop;
        public MicrowaveOven() {
        //Thiết lập một số thông tin cho Frame
        super("The Front View Of A MicroWave Oven");
        setLayout(new BorderLayout());
        //Thiết lập canh giữa màn hình
        setLocationRelativeTo(null);
        setSize(370, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        //Khởi tạo Component
        /*Khởi tạo JPanel*/
        jpnRight=new JPanel(new BorderLayout());
        jpnButton=new JPanel(new GridLayout(4,3));

        /*Khởi tạo JTextField*/
        jtxtTime=new JTextField("Time to be displayed here");
        /*Khởi tạo JButton*/
        jbtnFood = new JButton("Food to be placed here");
        jbtn1 = new JButton("1");
        jbtn2 = new JButton("2");
        jbtn3 = new JButton("3");
        jbtn4 = new JButton("4");
        jbtn5 = new JButton("5");
        jbtn6 = new JButton("6");
        jbtn7 = new JButton("7");
        jbtn8 = new JButton("8");
        jbtn9 = new JButton("9");
        jbtn0 = new JButton("0");
        jbtnStart = new JButton("Start");
        jbtnStop = new JButton("Stop");


        /*Thêm Conponent vào Frame*/
        jpnRight.add(jtxtTime,BorderLayout.NORTH);


        jpnButton.add(jbtn1);
        jpnButton.add(jbtn2);
        jpnButton.add(jbtn3);
        jpnButton.add(jbtn4);
        jpnButton.add(jbtn5);
        jpnButton.add(jbtn6);
        jpnButton.add(jbtn7);
        jpnButton.add(jbtn8);
        jpnButton.add(jbtn9);
        jpnButton.add(jbtn0);
        jpnButton.add(jbtnStart);
        jpnButton.add(jbtnStop);

        add(jbtnFood, BorderLayout.WEST);
        add(jpnRight, BorderLayout.CENTER);
        jpnRight.add(jtxtTime, BorderLayout.NORTH);
        jpnRight.add(jpnButton, BorderLayout.CENTER);

         setVisible(true);
}

public static void main(String[] args) {
        new MicrowaveOven();
    }
}

Nhập Xuất Và Lấy Ngày Tháng Trong Java – Ôn Tập 1

I.Nhập dữ liệu bằng BufferedReader và Scanner


package Begin;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
*
* @author PC
*/
public class IO {
public static void main(String[] args) {
String myValue;
    try {
          System.out.println("---Nhập dữ liệu từ bàn phím sử dụng BufferedReader---");
          BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
          System.out.print("Hãy nhập 1 giá trị :");
          //Giá trị nhập vào là chuỗi để ép về kiểu số thì chúng ta có thể sử dụng ép kiểu
          // int newValue=Integer.parseInt(br.readLine()); ..v..v
          myValue=br.readLine();
          System.out.println("Giá trị vừa nhập là :"+myValue);

          /*-----------------------------------------------------------------*/

          System.out.println("---Nhập dữ liệu từ bàn phím sử dụng Scanner---");
          Scanner sc=new Scanner(System.in);
          System.out.print("Hãy nhập 1 giá trị :");
          //Để xác định kiểu dữ liệu nhập vào thì chúng ta có thể sử dụng
          // myValue=sc.nextInt();
          // myValue=sc.nextDouble();
          // myValue=sc.nextFloat();
          // ..v..v
          myValue=sc.nextLine();
          System.out.print("Giá trị vừa nhập là :"+myValue);

         } catch (IOException ex) {
         JOptionPane.showMessageDialog(null,ex,"Error",JOptionPane.ERROR_MESSAGE);
      }
   }
}

II.Nhập dữ liệu bằng JOptionPane


String myValue=JOptionPane.showInputDialog("Input");
System.out.print("Giá trị vừa nhập là :"+myValue);

Kết quả là một hộp thoại có trường để chúng ta nhập dữ liệu vào

II.Lấy ngày tháng trong Java sử dụng đối tượng GregorianCalendar


package Begin;

import java.util.GregorianCalendar;

public class Datetime {
public static void main(String[] args) {
      //Để lấy được ngày tháng hiện tại chúng ta tạo mới đối tượng GregorianCalendar
      GregorianCalendar calendar=new GregorianCalendar();
      System.out.println(calendar.getTime());
      //Để thiết lập giá trị ngày tháng cho một biến
      //GregorianCalendar mydate=new GregorianCalendar(year,month,day);
      GregorianCalendar mydate=new GregorianCalendar(2003,05,26);
      System.out.println(mydate.getTime());

    }
}

Đọc Tập Tin Bằng Phần Mềm Đọc Đĩa Thô Norton Disk Editor 2002

Ở đây chúng ta sẽ sử dụng Hiren’sBootCD 9.9  và máy ảo Virtual Box.

I.Phân vùng đĩa 

Đầu tiên chúng ta vào Hiren’s BootCD 9.9 và chọn Start BootCD

Sau đó chúng ta sẽ chọn Partition Tools

Tiếp theo chọn Partition Magic Pro 8.05 để thực hiện việc phân vùng đĩa cứng

Thực hiện việc phân vùng  ở đây chúng ta sẽ phân vùng đĩa cứng thành : 1 Primary FAT32,

1 Extended ,trong Extend sẽ có 3 ổ đĩa Logical định dạng theo FAT32

Sau khi hoàn thành việc phân vùng cho ổ đĩa ta tiến hành cài Win vào ổ C hoặc sử dụng Mini Windows XP ở Hiren’s Boot có sẵn .Thực hiện việc tạo 1 Folder có tên MyFolder  ở ổ đĩa D hoăc ổ đĩa nào bất kỳ

trong MyFolder tạo ra tập tin MyText.txt với nội dung : Hello World ,Nào chúng ta sẽ cùng nhau bắt đầu đọc tập tin bằng phần mềm Norton Disk Editor 2002 trong Hiren’s Boot 9.9 .

II.Đọc Folder 

Vào lại Hiren’s Boot 9.9 của chúng ta,chúng ta sẽ chọn Hard Disk Tools 

Sau đó chọn More 2 lần  :

Tiếp theo ta sẽ chọn Norton Disk Editor 2002 

Sau đó màn hình như bên dưới sẽ hiện ra ta tiến hành chọn vào Object -> Drive

Chọn vào Physical disks để đọc đĩa cứng vật lý .

Ok sau khi chọn xong thì chúng ta đang ở Sector 0 là Sector đầu tiên của Ổ đĩa trong đó có chứa MBR (Master Boot Record) .Master Boot Record dùng để mô tả thông tin của các phân vùng trên ổ đĩa .

MBR sẽ được biểu diễn bằng 64 byte chạy từ 01BE -> 01FD

Trong 64 byte đó thì được chia nhỏ thành 4 entry mỗi entry có độ dài 16 byte

Nhìn vào MBR bên dưới ta nhận ra ổ đĩa này được chia làm 2 phân vùng .

Phân vùng 1 Primary từ 01BE -> 01CD

Phân vùng 2 Extended  từ 01CE->01DD

Ở đây chúng ta chỉ nói đến vấn đề đọc File còn những chi tiết khác về thông tin ổ đĩa cách đọc các thông tin đó như thế nào thì các bạn có thể tham khảo thêm ở giáo trình FAT32

Lúc nảy chúng ra có lưu 1 Folder tên là MyFolder ở trong ổ đĩa D vậy giờ chúng ta sẽ phải đi vào vùng Extended để đọc thông tin của ổ đĩa D.

Ở đây tại 01D6->01D9  có giá trị 7A 00 77 01 đảo ngược giá trị này lại 01 77 00 7A =24579450 là Sector bắt đầu của vùng EBR(Extend Boot Record) ,Vùng này mô tả các thông tin của các ổ đĩa Logical

Chúng ta sẽ đi tới Sector 24579450 bằng cách chọn menu Object -> Physical Sector

Đã đến được EBR rồi ở đây Entry đầu tiên mô tả thông tin ổ đĩa D ở 01C6->01C9 có giá trị 3F 00 00 00 đảo ngược lại là 00 00 00 3F = 63 là địa chỉ logic của ổ đĩa D .muốn biết địa chỉ vật lý chúng ta lấy  Địa chỉ bắt đầu vùng Extended + địa chỉ logic của ổ đĩa D = 24579450 + 63 = 24579513

Đi đến Sector 24579513 đi đến được đầu của ổ đĩa D đây là vùng Reserved của ổ đĩa D ở đây ta sẽ đọc được những thông tin quan trọng .

 Ở 000D có giá trị 04  => 4 là số sector/cluster

000E->000F có giá trị 26 00 đảo ngược lại 00 26 => 38 là số sector của vùng Reserved 

0010 có giá trị 02 => có 2 FAT Structure

Ở vị trí 0024->0027 có giá trị 45 3E 00 00 đảo ngược lại là 00 00 3E 45 => 15941 là số sector của 1 FAT Structure vậy 2 FAT Structure sẽ có giá trị là (15941 *2 ) =31882

Để đọc được Folder hoặc File ta sẽ phải tới được vùng Root Directory nơi này là nơi mô tả thông tin các Folder hay tập tin có trên phân vùng ổ đĩa đó .

Sector Begin Root Directory = (Sector Bắt Đầu Vùng Reserved + Số Sector Vùng Reserved + Số Sector của Vùng FAT )

Sector Begin Root Directory=  24579513 + 38 +  31882 = 24611433

Nào cùng đi tới vùng Root Directory của ổ đĩa D ở Sector 24611433 

Ở đây ta sẽ tìm thấy các Folder hoặc tập tin Ở trên ta đã nhìn thấy thông tin mô tả Folder MyFolder rồi giờ ta thực hiện việc đọc nó thôi

Ở 0154 -> 0155 có giá trị 00 00 đảo ngược lại 00 00 là giá trị byte cao của cluster bắt đầu

Ở 015A->015B có giá trị 03 00 đảo ngược lại 00 03 là giá trị của byte thấp của cluster bắt đầu

Ghép giá trị byte cao và byte thấp sau khi đảo ngược lại thành 00 00 00 03 => N=3

Áp dụng vào công thức

Sector đầu tiên của cluster = (N-2) * Số Sector /Cluster  + Địa chỉ bắt đầu vùng Root Directory

Sector vật lý đầu tiên của vùng dữ liệu=(3-2) * 4 +  24611433 =  24611437

Chúng ta đi đến Sector 24611437

Lúc này đã đọc được Folder giờ ta chon vào View -> as Hex chúng ta sẽ nhìn thấy được bên trong nó có 1 tập tin tên MyText.txt

III. Đọc Tập Tin

Thực hiện việc đọc tập tin này

Ở 0094 -> 0095 có giá trị 00 00 đảo ngược lại 00 00 là giá trị byte cao của cluster bắt đầu

Ở 009A->009B có giá trị 11 00 đảo ngược lại 00 11 là giá trị của byte thấp của cluster bắt đầu

Ghép giá trị byte cao và byte thấp sau khi đảo ngược lại thành 00 00 00 11 => N=17

Áp dụng vào công thức

Sector đầu tiên của vùng dữ liệu = (N-2) * Số Sector /Cluster  + Địa chỉ bắt đầu vùng Root Directory

Sector vật lý đầu tiên của vùng dữ liệu=(17-2) * 4 +  24611433 =  24611493

Chúng ta đi đến Sector 24611493

Dòng Hello World đã xuất hiện vậy chúng ta đã hoàn thành việc đọc Folder và Tập Tin bằng Norton Disk Editor .

Sử Dụng Phương Thức GET Và POST Để Sửa Dữ Liệu – Bài 6

I.Sửa Lại Code Cho File index.php

Ở thẻ table xuất dữ liệu ra thì bổ sung thêm chức năng sửa như sau :


<table border="1">
   <tr>
     <th>ID</th>
     <th>Username</th>
     <th>Email</th>
     <th>Password</th>
     <th>Avatar</th>
     <!--Chức năng sửa-->
    <th>Edit</th>
    <!--Chức năng xóa-->
    <th>Delete</th>

   </tr>
<?php
//Thực hiện truy vấn

$result=$conn->query("SELECT * FROM users");

//Lấy dữ liệu bằng fetch_objec
while($row=$result->fetch_object())
{
?>
<tr>
     <td><?php echo $row->id ?></td>
     <td><?php echo $row->username ?></td>
     <td><?php echo $row->email ?></td>
     <td><?php echo $row->password ?></td>
     <td><?php echo $row->avatar ?></td>
     <!--Sửa user-->
     <td><a href="edituser.php?edit=<?php echo $row->id ?>">Sửa</a></td>
    <!--Xóa user-->
    <td><a href="?del=<?php echo $row->id ?>">Xóa</a></td>
</tr>

<?php
}
?>

</table>

Trong đó đoạn code này có nghĩa là khi nhấn vào sửa thì sẽ chuyển đến trang edituser.php và có biến edit là id của đối tượng cần sửa .


<!--Sửa user-->
<td><a href="edituser.php?edit=<?php echo $row->id ?>">Sửa</a></td>

Khi nhấn vào sửa thì đường dẫn sẽ là :

http://localhost:8080/PhanBietFetch/edituser.php?edit=22

Từ đó bên file edituser.php sẽ sử dụng phương thức GET để lấy được giá trị 22 ở biến edit truyền trên URL

Đây là trang index sau khi sửa code :

II.Viết Code Cho File edituser.php

Tạo một file mới tên là edituser.php và có đoạn code sau :


<link rel="stylesheet" href="style.css">
<?php
//Bắt đầu phiên làm việc
session_start();

require('db.php');

if(!$_SESSION['access'] || (time()-$_SESSION['time'])>1800 || (isset($_GET['state']) && $_GET['state']=="logout"))
{
        session_destroy();
        header("location:login.php");
}
//Xác định id của user bằng cách sử dụng phương thức GET lấy thông tin trên đường dẫn URL
if(isset($_GET['edit']))
{
        $sql="SELECT * FROM users WHERE `id`=".$_GET['edit'];
        $result=$conn->query($sql);
        if($result->num_rows>0)
        {
            $user=$result->fetch_object();
        }
        else
        {
             header("location:index.php"); 
        }
}
//Khi người dùng chỉnh sửa thông tin xong và nhấn submit
if($_SERVER["REQUEST_METHOD"]=="POST")
{

       $username=$_POST['username'];
       $email=$_POST['email'];
       $password=$_POST['password'];
       if(!empty($_FILES['image']['name']))
       {
               $image=$_FILES['image']['name'];
               $image_path='./images/'.$image;
              if(preg_match("!image!",$_FILES['image']['type']))
              {
                 if(copy($_FILES['image']['tmp_name'],$image_path))
                 {
                     $sql="UPDATE `users` SET `username`='$username',`email`='$email',`password`='$password',`avatar`='$image' WHERE `id`=$user->id";
                     if($conn->query($sql)==true)
                     {
                          echo "<p class='success'>Update thành công !</p>";
                     }
                     else {
                           echo "<p class='error'>Update thất bại !</p>";
                      }
                  }
                  else
                      echo "<p class='error'>Quá trình tải lên thất bại !</p>";
          }
          else
               echo "<p class='error'>File tải lên không phải hình !</p>";
       }
       //Nếu không có tấm hình nào được gửi lên
       else
       {
              $sql="UPDATE `users` SET `username`='$username',`email`='$email',`password`='$password' WHERE `id`=$user->id";
              if($conn->query($sql)==true)
              {
                   echo "<p class='success'>Sửa thành công !</p>";
              }
              else {
                   echo "<p class='error'>Sửa thất bại !</p>";
               }
       }

}

?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Add User</title>
</head>
<body>
<form class="" action="" method="post" enctype="multipart/form-data">
<table>
  <tr>
      <td>User Name</td>
      <td><input type="text" name="username" value="<?php if(!empty($user->username)) echo $user->username ?>" required></td>
  </tr>
   <tr>
       <td>Email</td>
       <td><input type="email" name="email" value="<?php if(!empty($user->email)) echo $user->email ?>" required></td>
   </tr>
    <tr>
       <td>Password</td>
       <td><input type="password" name="password" value="<?php if(!empty($user->password)) echo $user->password ?>" required></td>
    </tr>
     <tr>
        <td></td>
        <td><input type="file" name="image" value=""></td>
    </tr>
     <tr>
        <td></td>
        <td><input type="submit" name="submit" value="Submit"> <input onclick="window.location='index.php'" type="button" name="back" value="Back"></td>
     </tr>
 </table>
</form>
</body>
</html>

Khi sửa thông tin thành công thì sẽ được kết quả sau :

Link Code :  Here

Sử Dụng Phương Thức POST Để Thêm Dữ Liệu – Bài 5

I.Xây dựng và viết code xử lý cho file adduser.php

Ta tạo một file có tên adduser.php trong file này có đoạn code sau :


<link rel="stylesheet" href="style.css">
<?php
//Bắt đầu phiên làm việc
session_start();

require('db.php');

if(!$_SESSION['access'] || (time()-$_SESSION['time'])>1800 || (isset($_GET['state']) && $_GET['state']=="logout"))
{
     session_destroy();
     header("location:login.php");
}

if($_SERVER['REQUEST_METHOD']=="POST")
{
      $username=$_POST['username'];
      $email=$_POST['email'];
      $password=$_POST['password'];
      $image=$_FILES['image']['name'];
      $image_path='./images/'.$image;

     if(preg_match("!image!",$_FILES['image']['type']))
     {
         if(copy($_FILES['image']['tmp_name'],$image_path))
         {
            $sql="INSERT INTO `users`(`username`, `email`, `password`, `avatar`) VALUES ('$username','$email','$password','$image')";
            if($conn->query($sql)===true)
            {
                echo "<p class='success'>Thêm Thành Công !</p>";
            }
            else
                echo "<p class='error'>Thêm Thất Bại !</p>";
           }

      }
      else
           echo "<p class='error'>File tải lên không phải hình !</p>";
}

?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Add User</title>
</head>
<body>
<form class="" action="" method="post" enctype="multipart/form-data">
<table>
    <tr>
       <td>User Name</td>
       <td><input type="text" name="username" value="" required></td>
    </tr>
    <tr>
       <td>Email</td>
       <td><input type="email" name="email" value="" required></td>
   </tr>
   <tr>
       <td>Password</td>
       <td><input type="password" name="password" value="" required></td>
  </tr>
  <tr>
       <td></td>
       <td><input type="file" name="image" value="" required></td>
  </tr>
   <tr>
        <td></td>
        <td><input type="submit" name="submit" value="Submit"> <input onclick="window.location='index.php'" type="button" name="back" value="Back"></td>
  </tr>
 </table>
</form>
</body>
</html>

Sau khi thực hiện việc tạo user thành công thì sẽ xuất ra kết quả :

II.Giải thích

Để tải tập tin trong thẻ form phải code đoạn code sau 


enctype="multipart/form-data"

Nếu Server nhận được yêu cầu từ người dùng gửi dữ liệu lên sau đó ta thực hiện việc lấy dữ liệu bằng phương thức $_POST[‘name’] trong đó name là name của input


$username=$_POST['username'];
$email=$_POST['email'];
$password=$_POST['password'];
$image=$_FILES['image']['name'];
$image_path='./images/'.$image;

với $image_path là đường dẫn mà file hình sẽ lưu vào .

Thực hiện việc kiểm tra xem file tải lên có phải là hình hay không nếu là hình thì thực hiện việc copy hình từ thư mục tmp của Server sang đường dẫn $image_path.

Vì khi ta submit form kèm theo file ,file đó sẽ được lưu tạm thời vào trong thư mục tmp của Server rồi sau đó mới được xử lý và copy sang đường dẫn chính thức nếu thành công việc kiểm tra và chen dữ liệu.Trong Server đường dẫn của thư mục tmp là  [Tên Ổ Đĩa]:\xampp\tmp


if(preg_match("!image!",$_FILES['image']['type']))
{
    if(copy($_FILES['image']['tmp_name'],$image_path))
    {
         $sql="INSERT INTO `users`(`username`, `email`, `password`, `avatar`) VALUES ('$username','$email','$password','$image')";
         if($conn->query($sql)===true)
         {
              echo "<p class='success'>Thêm Thành Công !</p>";
         }
         else
              echo "<p class='error'>Thêm Thất Bại !</p>";
     }

}
else
    echo "<p class='error'>File tải lên không phải hình !</p>";

Link Code : Here

 

I wanna share something