помилка в операторі INNER JOIN

Я намагаюся написати запит INNER JOIN . Я хотів отримати рядки/інформацію, які знаходяться в двох різних таблицях. Ось що я намагаюся:

Імена таблиць: Студенти та main_table

$sql =mysql_query ("SELECT main_table.maric_no, main_table.academic_session, main_table.semester, 
main_table.course_name, main_table.total, students.first_name, students.last_name, 
students.other_name, students.level 
FROM main_table INNER JOIN students ON 
main_table.matric_no = students.matric_no 
WHERE main_table.matric = mysql_real_escape_string($_POST[matric_no]'"); 

$number_cols = mysql_num_fields($sql); 

Ось повідомлення про помилку:

ERROR: mysql_num_fields() expects parameter 1 to be resource, boolean given in c:\filepath on line Number..

Звідки може виникнути проблема?

0
Завжди додайте або die (mysql_error ()) до кінця запиту, щоб дізнатися, чи є помилки.
додано Автор JJJ, джерело
Здається, ваша помилка виникла через неправильне використання mysql_num_fields . Я думаю, що ви дійсно хочете mysql_query .
додано Автор StudyOfCrying, джерело
Це точний дублікат проблеми, про яку ви вже повідомляли: stackoverflow. com/questions/9162901/internal-join-твердження-err & zwnj; або/& hellip;
додано Автор StudyOfCrying, джерело
Ви могли б вивести результати mysql_error() відразу після виклику mysql_num_fields
додано Автор deltree, джерело
Я відредагував код, щоб включити mysql_query на першому операторі SELECT.
додано Автор user1183307, джерело

6 Відповіді

http://php.net/manual/en/function.mysql-num -fields.php

Необхідно передати результат запиту mysql_num_fields , а не рядок SQL. Спробуйте:

$res = mysql_query($sql);
$number_cols = mysql_num_fields($res);
4
додано
як це було отримано плюс голосування, коли він навіть не стверджував, що помилка на sql рядок запиту?
додано Автор Melvin Protacio, джерело
Спочатку я виконав запит. Але я все ще отримую ту ж помилку. Дякую
додано Автор user1183307, джерело
mysql_real_escape_string($_POST[matric_no]

Ви не можете використовувати виклик функції, подібний до того, що знаходиться в подвійному рядку.

"WHERE main_table.matric = '" . mysql_real_escape_string($_POST[matric_no]) . "'");

Він повинен виглядати так:

$sql = mysql_query ("SELECT main_table.maric_no, main_table.academic_session, main_table.semester, 
main_table.course_name, main_table.total, students.first_name, students.last_name, 
students.other_name, students.level 
FROM main_table INNER JOIN students ON 
main_table.matric_no = students.matric_no 
WHERE main_table.matric = ". mysql_real_escape_string($_POST[matric_no]) . "'"); 
1
додано

Дві помилки на перший погляд:

  1. mysql_real_escape_string() is a PHP function, not a mysql-function. It is used to make data safer before using it in a mysql-query.
  2. Your $_POST-variable isn't assigned properly.

Відформатуйте його так:

$sql = mysql_query("
    SELECT M.maric_no, M.academic_session,  
        M.semester, M.course_name, M.total, 
        S.first_name, S.last_name, 
        S.other_name, S.level 
    FROM main_table M 
    INNER JOIN students S ON M.matric_no = S.matric_no 
    WHERE M.matric = '"
    .mysql_real_escape_string($_POST['matric_no'])
    ."'"); 

Я взяв на себе сміливість додавати псевдоніми до імен таблиць, це досить багато чого очищує ваш оператор SQL.

Можуть бути й інші помилки (помилкові поля, чи це ваше твердження WHERE дійсно в полі main_table.matric і не main_table.matric_no ?) проаналізуйте це, вам потрібно надати більш детальну інформацію про ваші таблиці.

1
додано

mysql_query() returns Boolean False when it fails with an error. Since there is an error in your SQL, $sql equals False.

mysql_num_fields() expects you to pass in a result set, not a Boolean value, hence the error: ERROR: mysql_num_fields() expects parameter 1 to be resource, boolean given.

Ви включаєте mysql_real_escape_string() , що є функцією PHP, безпосередньо в запиті. Замість цього:

"WHERE main_table.matric = mysql_real_escape_string($_POST[matric_no]'");"

Спробуйте щось подібне, якщо matric - це число:

"WHERE main_table.matric = ". mysql_real_escape_string($_POST[matric_no]);

Використовуйте функцію mysql_error() в PHP, щоб побачити, що MySQL повідомляє, що ваша помилка в SQL.

1
додано

mysql_query returns false if there is an error, thus the boolean result and not a resource. try this

$sql =mysql_query ("SELECT main_table.maric_no, main_table.academic_session, main_table.semester, 
main_table.course_name, main_table.total, students.first_name, students.last_name, 
students.other_name, students.level 
FROM main_table INNER JOIN students ON 
main_table.matric_no = students.matric_no 
WHERE main_table.matric = '".mysql_real_escape_string($_POST[matric_no])."'"); 
1
додано
@KanyinsolaOyesanmi: mysql_real_escape_string - це функція PHP і не може знаходитися всередині рядка.
додано Автор Rocket Hazmat, джерело
так, я знаю, але звідки виникає проблема? Чи є це структурою запиту чи що? Я не використовую INNER JOIN ....... ON ...... WHERE?
додано Автор user1183307, джерело

спочатку потрібно виконати запит.

$result = mysql_query($sql);
$num_cols = mysql_num_fields($result);
0
додано
Що ви отримуєте, якщо ви зробите var_dump ($ result); ?
додано Автор ianbarker, джерело
Я зробив, але все ще показував ту ж проблему.
додано Автор user1183307, джерело
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php