10/10/2018, 10:51

Warning: mysql_fetch_array()

Code:
include("ketnoicsdl.php");
$query="select * from thanhvien where tendangnhap='".$tendangnhap."' and matkhau='".$matkhau."'";
mysql_query($query) or die (mysql_error());
while($row = mysql_fetch_array($query))
{
echo $row['capbac'];
}
lỗi xảy ra là:
Code:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/abc/public_html/dangnhap.php on line 12
không biết sai chỗ nào, các bác cố vấn dùm thanks!
vzic viết 13:04 ngày 10/10/2018
Có một số vấn đề mình xin nói
1. Viết query kiểu kia tốn hiệu suất vì phải scan 2 fields mới cho ra result.
"select matkhau,capbac from where taikhoan='".$taikhoan.'"" nôm na là như thế rồi bạn so sánh mật khẩu nhập vào và mật khẩu gọi ra từ query.
(Giải thích tí)
+ Giả sử bạn đánh index cho trường taikhoan khi work query trên nó sẽ sử dụng index nên tốc độ truy vấn sẽ cực nhanh. Và sẽ cho bạn matkhau,cap bac. Sau đó cái mật khẩu nhập vào tùy vào có mã hóa hay không, rồi bạn mã hóa sau đó so sánh với cái kết quả của truy vấn. Nếu = nhau thì sẽ login oke.
+ Còn cách của bạn. Nó sẽ phải scan full cái fields tàikhoản sau đó nó lại scan full cái matkhau. Độ phức tạo sẽ là ^2. Kể cả bạn index cho 2 fields thì cũng hơi điên vì cái matkhau index làm gì cơ chứ.
- > Tổng kết cách của mình nói tới sẽ giảm độ phức tạp đi 2 lần so với cách của chủ thớt. Và sẽ nhanh hơn khi có index
2. Query gọi đăng nhập thường có 1 kết quả ko nhất thiết phải while làm chi cho mệt.
Lỗi:
Bạn kiểm tra xem sự chính xác tên fields có thể nó gây lỗi vì không cho ra kết quả nào
1024KB viết 12:56 ngày 10/10/2018
Ặc, lỗi cơ bản:
PHP Code:
include("ketnoicsdl.php");
$query="select * from thanhvien where tendangnhap='".$tendangnhap."' and matkhau='".$matkhau."'";
mysql_query($query) or die (mysql_error());//old
$query mysql_query($query) or die (mysql_error());//new
while($row mysql_fetch_array($query))
{
echo 
$row***91;'capbac'***93;;

anhchanghaudau viết 12:52 ngày 10/10/2018
Được gửi bởi vzic
Có một số vấn đề mình xin nói
1. Viết query kiểu kia tốn hiệu suất vì phải scan 2 fields mới cho ra result.
"select matkhau,capbac from where taikhoan='".$taikhoan.'"" nôm na là như thế rồi bạn so sánh mật khẩu nhập vào và mật khẩu gọi ra từ query.
(Giải thích tí)
+ Giả sử bạn đánh index cho trường taikhoan khi work query trên nó sẽ sử dụng index nên tốc độ truy vấn sẽ cực nhanh. Và sẽ cho bạn matkhau,cap bac. Sau đó cái mật khẩu nhập vào tùy vào có mã hóa hay không, rồi bạn mã hóa sau đó so sánh với cái kết quả của truy vấn. Nếu = nhau thì sẽ login oke.
+ Còn cách của bạn. Nó sẽ phải scan full cái fields tàikhoản sau đó nó lại scan full cái matkhau. Độ phức tạo sẽ là ^2. Kể cả bạn index cho 2 fields thì cũng hơi điên vì cái matkhau index làm gì cơ chứ.
- > Tổng kết cách của mình nói tới sẽ giảm độ phức tạp đi 2 lần so với cách của chủ thớt. Và sẽ nhanh hơn khi có index
2. Query gọi đăng nhập thường có 1 kết quả ko nhất thiết phải while làm chi cho mệt.
Lỗi:
Bạn kiểm tra xem sự chính xác tên fields có thể nó gây lỗi vì không cho ra kết quả nào
Đoạn mã sai ở chỗ
include("ketnoicsdl.php");
$query="select * from thanhvien where tendangnhap='".$tendangnhap."' and matkhau='".$matkhau."'";
mysql_query($query) or die (mysql_error());

Câu này có làm việc, nhưng nó "làm thinh" chưa gán gì cả thì biến $query vẫn là chuỗi, ít ra phải là vầy
$query = mysql_query($query);
rồi mới vầy
while($row = mysql_fetch_array($query))
1024KB viết 12:59 ngày 10/10/2018
hớ hớ, mình vẫn nhanh hơn 1p
KuJangSung viết 12:52 ngày 10/10/2018
a! đúng là sai sót cơ bản, hiz! thanks các bác
jdkhang viết 12:54 ngày 10/10/2018
Góp ý, Câu query trên bạn nên viết là như thế này cho đơn giản:
Code:
$sql = "SELECT * FROM thanhvien WHERE tendangnhap='$tendangnhap' AND matkhau='$matkhau'";
anhchanghaudau viết 12:52 ngày 10/10/2018
Được gửi bởi 1024KB
hớ hớ, mình vẫn nhanh hơn 1p
ặc, bác nì vui nhỉ , cái nì free mà cũng tranh với anh em
izwebz viết 12:57 ngày 10/10/2018
Chắc là bạn cũng đã làm được rồi nhưng bạn có thể viết như sau cho rõ ràng
Code:
include("ketnoicsdl.php");

$query = "SELECT * 
          FROM thanhvien
          WHERE tendangnhap='$tendangnhap'
          AND matkhau='$matkhau'";
$result = mysqli_query($conDB,$query) or die('Khong chon duoc DB '. mysqli_error($conn));
while($rows = mysqli_fetch_array($result, MYSQLI_NUM) {
echo $rows[0];
}
1. Khi viết lệnh nên tách nó ra từng dòng thì sau này dễ sửa lỗi hơn.

2. Đang trong dấu nháy kép có thể sử dụng biến mà không cần nối chuỗi. Bạn có thê sử dụng dấu ngoặc {$tendangnhap} cho thêm rõ ràng.

3. Tham số tùy chọn của hàm mysqli_fetch_array là MYSQLI_ASSOC, MYSQLI_NUM và MYSQLI_BOTH nên được gọi để phân biệt rõ từng loại mảng trả về. Trong trường hợp của bạn chỉ cần một dòng thì dùng dạng mảng chỉ mục index là hợp lý hơn là dùng mảng kết hợp.

Cuối cùng khi bạn muốn login thôi thì không cần phải chọn *. Đặc biệt với những bảng có mật khẩu thì nếu không thực sự cần thiết, không nên chọn nó ra. Để nó trong DB an toàn hơn. Mà sao mật khẩu lại không mã hóa ta? ít ra cũng phải sha1() hoặc MD5() chứ nhỉ?
anhchanghaudau viết 13:04 ngày 10/10/2018
Được gửi bởi izwebz
Chắc là bạn cũng đã làm được rồi nhưng bạn có thể viết như sau cho rõ ràng
PHP Code:
include("ketnoicsdl.php");

$query "SELECT * 
          FROM thanhvien
          WHERE tendangnhap='
$tendangnhap'
          AND matkhau='
$matkhau'";
$result mysqli_query($conDB,$query) or die('Khong chon duoc DB 'mysqli_error($conn));
while(
$rows mysqli_fetch_array($resultMYSQLI_NUM) {
echo 
$rows***91;0***93;;

1. Khi viết lệnh nên tách no ra từng dòng thì sau này dễ sửa lỗi hơn. Muốn bỏ cái gì chỉ cần comment nó ra

2. Đang trong dấu nháy kép có thể sử dụng biến mà không cần nối chuỗi. Bạn có thê sử dụng dấu ngoặc {$tendangnhap} cho thêm rõ ràng.

3. Tham số tùy chọn của hàm mysqli_fetch_array là MYSQLI_ASSOC, MYSQLI_NUM và MYSQLI_BOTH nên được gọi để phân biệt rõ từng loại mảng trả về. Trong trường hợp của bạn chỉ cần một dòng thì dùng dạng mảng chỉ mục index là hợp lý hơn là dùng mảng kết hợp.

Cuối cùng khi bạn muốn login thôi thì không cần phải chọn *. Đặc biệt với những bảng có mật khẩu thì nếu không thực sự cần thiết, không nên chọn nó ra. Để nó trong DB an toàn hơn. Mà sao mật khẩu lại không mã hóa ta? ít ra cũng phải sha1() hoặc MD5() chứ nhỉ?
Đơn giản bạn đó là người mới bắt đầu
Bài liên quan
0