मैं निम्नलिखित क्वेरी चलाने की कोशिश कर रहा हूं:

SELECT nfc_film.title, nfc_film.film_id, nfc_film.description, nfc_film.release_year, nfc_film.rating, nfc_film.last_update, nfc_category.name
  FROM nfc_film
JOIN nfc_film_category
  ON nfc_film.film_id = nfc_film_category.film_id
JOIN nfc_category
  ON nfc_film_category.category_id = nfc_category.category_id  LIMIT 10 OFFSET 0

यह काम करता है अगर मैं इसे 'SQLite के लिए डीबी ब्राउज़र' में डालता हूं, तो सही फ़ील्ड वापस कर दिए जाते हैं।

लेकिन PHP में इसे लागू करने का प्रयास करते समय यह काम नहीं करता है:

$filmQuery = "
SELECT nfc_film.title, nfc_film.film_id, nfc_film.description, nfc_film.release_year, nfc_film.rating, nfc_film.last_update, nfc_category.name
  FROM nfc_film
JOIN nfc_film_category
  ON nfc_film.film_id = nfc_film_category.film_id
JOIN nfc_category
  ON nfc_film_category.category_id = nfc_category.category_id ";

if($search_term && $category){
  $filmQuery .= "
  WHERE
    nfc_film.title LIKE :searchterm
  AND
    nfc_category.name = :category";
} else if ($search_term && !$category) {
  $filmQuery .= "
  WHERE
    nfc_film.title LIKE :searchterm";
} else if (!$search_term && $category) {
  $filmQuery .= "
  WHERE
    nfc_category.name = :category";
}

$filmQuery .= " LIMIT 10 OFFSET :page";

जब न तो category और न ही searchterm मिलते हैं, तब इसका समाधान होता है:

SELECT nfc_film.title, nfc_film.film_id, nfc_film.description, nfc_film.release_year, nfc_film.rating, nfc_film.last_update, nfc_category.name
      FROM nfc_film
    JOIN nfc_film_category
      ON nfc_film.film_id = nfc_film_category.film_id
    JOIN nfc_category
      ON nfc_film_category.category_id = nfc_category.category_id  LIMIT 10 OFFSET :page

मैं फिर क्वेरी तैयार करता हूं, बांधता हूं और निष्पादित करता हूं:

$sqlGetFilms = $dbConn->prepare($filmQuery);
$sqlGetFilms->bindParam(':searchterm', $sqlSearchTerm);
$sqlGetFilms->bindParam(':category', $category);
$sqlGetFilms->bindParam(':page', $page);
$sqlGetFilms->execute();
$query = $sqlGetFilms->fetchAll();

जब कुछ नहीं searchterm और category मिलते हैं, तो रिकॉर्ड वापस कर दिए जाते हैं। लेकिन इस कोड में दिखाई देने वाली कोई अन्य स्थिति किसी भी रिकॉर्ड को वापस नहीं करती है, भले ही वे 'SQLite के लिए डीबी ब्राउज़र' में चलने पर दिखाई देते हैं।

संपादित करें: मैंने हार्डकोडिंग की कोशिश की है

SELECT nfc_film.title, nfc_film.film_id, nfc_film.description, nfc_film.release_year, nfc_film.rating, nfc_film.last_update, nfc_category.name
      FROM nfc_film
    JOIN nfc_film_category
      ON nfc_film.film_id = nfc_film_category.film_id
    JOIN nfc_category
      ON nfc_film_category.category_id = nfc_category.category_id 
      WHERE
        nfc_film.title LIKE '%k%' LIMIT 10 OFFSET 0

और कुछ भी नहीं लौटा

-1
Adam Cole 27 मई 2019, 20:51

1 उत्तर

सबसे बढ़िया उत्तर

आप पा सकते हैं कि जब आप केवल एक या दूसरे शब्दों का उपयोग करते हैं तो आपको एक त्रुटि मिलती है जो एक गैर-मौजूद चर से जुड़ने की कोशिश करने जैसा है।
यह (मुझे लगता है) नीचे है जहां आप सशर्त रूप से एसक्यूएल बनाते हैं, आपके पास :searchterm या :category या दोनों हो सकते हैं - लेकिन आप हमेशा कोशिश करते हैं और उन दोनों को बांधते हैं।

तो इसके बजाय, यदि बाध्य करने का कोई मूल्य है - तो प्रत्येक शब्द को अलग-अलग बांधें ...

if(!empty($search_term)){
    $sqlGetFilms->bindParam(':searchterm', $sqlSearchTerm);
} 
if(!empty($category)) {
    $sqlGetFilms->bindParam(':category', $category);
} 
0
Nigel Ren 27 मई 2019, 18:08