2011-12-10 27 views
5

tôi không thể có được tác giả của tôi từ php của tôi trích dẫnmysql php lỗi - Hệ thống quote

tôi có một bảng báo giá: id, báo giá, viện trợ

tôi có một bảng tác giả: id, tên , vv ...

<?php 

$DB_SERVER = "localhost"; 
$DB_USER = "root"; 
$DB_PASS = ""; 
$DB_NAME = "test"; 
$con = mysql_connect($DB_SERVER, $DB_USER, $DB_PASS); 
mysql_select_db($DB_NAME); 

$sql = mysql_query("SELECT * FROM quotes WHERE id = ".$_GET['id'], $con); 
$row = mysql_fetch_row($sql); 

$sql = mysql_query("SELECT * FROM author where aid = " . $row[1], $con); 
$row = mysql_fetch_row($sql); 


var_dump($row); 

bây giờ tôi nhận được lỗi này Cảnh báo: mysql_fetch_row() dự kiến ​​tham số 1 là tài nguyên, boolean được đưa ra trong /var/www/domain.com/php.php trên đường dây 14 NULL

+0

Bạn không thực hiện bất kỳ lỗi nào khi kiểm tra truy vấn của mình. Bạn * cần * để thực hiện điều đó sau cuộc gọi 'mysql_query()'. Nếu không, tập lệnh của bạn sẽ bị hỏng nếu truy vấn không thành công. Làm thế nào để làm điều này được nêu trong [hướng dẫn sử dụng trên mysql_query() '] (http://php.net/mysql_query) hoặc trong [câu hỏi tham khảo này.] (Http://stackoverflow.com/questions/6198104/reference -what-là-một-hoàn hảo-mã-mẫu-sử dụng-the-mysql-mở rộng) –

+2

Ngoài ra, mã bạn hiển thị là dễ bị tổn thương [SQL injection] (http://php.net/manual/en/security. database.sql-injection.php). Sử dụng phương pháp vệ sinh thích hợp của thư viện của bạn (như 'mysql_real_escape_string()' cho thư viện mysql cổ điển), hoặc chuyển sang PDO và các câu lệnh chuẩn bị sẵn sàng. –

+0

có thể trùng lặp của [mysql_fetch_array() dự kiến ​​tham số 1 là tài nguyên, boolean được chọn trong] (http://stackoverflow.com/questions/2973202/mysql-fetch-array-expects-parameter-1-to-be-resource -boolean-given-in-select) – fuxia

Trả lời

7

nếu bạn print_r($row); sau khi truy vấn đầu tiên, bạn sẽ thấy một cái gì đó như:

Array 
(
    [0] => id 
    [1] => quote 
    [2] => aid 
) 

sau đó trên truy vấn thứ hai của bạn, bạn sử dụng $row[1] đó là báo giá (chuỗi) và không phải là số.

$sql = mysql_query("SELECT * FROM author where aid = " . $row[1], $con); 

nếu bạn echo lỗi (sử dụng mysql_error($con)), bạn sẽ thấy một cái gì đó:

Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn rằng tương ứng với phiên bản máy chủ MySQL của bạn cho đúng cú pháp để sử dụng gần 'báo giá

thay vì sử dụng mysql_fetch_row sử dụng mysql_fetch_assoc và chìa khóa của mảng sẽ là tên của cột. Bằng cách này, nó rất dễ dàng để lấy dữ liệu. Và đừng quên đóng kết nối của bạn.

<?php 
$_GET['id'] = 1; 
$DB_SERVER = "localhost"; 
$DB_USER = "root"; 
$DB_PASS = ""; 
$DB_NAME = "test"; 
$con = mysql_connect($DB_SERVER, $DB_USER, $DB_PASS); 
mysql_select_db($DB_NAME); 
$sql = mysql_query("SELECT * FROM quotes WHERE id = " . (int)$_GET['id'], $con); // or you can use the mysql_real_escape_string 
if(!$sql) { 
    echo mysql_error($con); 
} 
$row = mysql_fetch_assoc($sql); 
mysql_free_result($sql); 

$sql = mysql_query("SELECT * FROM author where id = " . (int)$row['aid'], $con); 
if(!$sql) { 
    echo mysql_error($con); 
} 
$row = mysql_fetch_assoc($sql); 
mysql_free_result($sql); 

print_r($row); 
mysql_close($con); 
1

Từ manual:

mysql_query() trả về một tài nguyên trên thành công, hoặc FALSE về lỗi.

mysql_query() cũng sẽ không thành công và trả về SAI nếu người dùng không có quyền truy cập vào (các) bảng được tham chiếu bởi truy vấn.

Vì vậy, chỉ làm một số lỗi nhanh chóng kiểm tra

$sql = mysql_query("SELECT * FROM author where aid = " . $row[1], $con); 
if ($sql) { 
    $row = mysql_fetch_row($sql); 
} 
else { 
    //error 
} 
+0

+1. Bạn có thể gọi 'mysql_error ($ con)' để nhận được lỗi MySQL cụ thể. –

Các vấn đề liên quan