簡體   English   中英

PHP MySQL 覆蓋 SELECT 語句返回 null

[英]PHP MySQL imbricate SELECT statements return null

我嘗試執行查詢,但結果為空,我在 PhpMyAdmin 中執行了相同的查詢並返回結果。

問題是當查詢在另一個 SELECT 語句(疊瓦)中包含 SELECT 時,因此當查詢僅包含一個 SELECT 語句時,它可以正常工作並返回結果。 這是代碼:

db_config.php

<?php    
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "university_db";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

get_planning.php

<?php
require 'db_config.php';

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT cours.jour, 
TIME_FORMAT(cours.heure_debut, '%H:%i') AS debut, 
TIME_FORMAT(cours.heure_fin, '%H:%i') AS fin, 
enseignant.nom_ens as prof, modules.nom_mod as module, salles.nom_salle as salle
FROM cours, promotion, enseignant, modules, salles 
WHERE cours.id_promo = (SELECT id_promo FROM promotion WHERE promotion.niveau = '2' 
AND promotion.id_speci = (SELECT id_speci FROM spécialité WHERE nom_speci = 'MGL')) 
AND cours.id_promo = promotion.id_promo AND cours.id_ens = enseignant.id_ens AND cours.id_salle = salles.id_salle AND cours.id_mod = modules.id_mod 
ORDER BY cours.id_cours;";

$result = $conn->query($sql);

if($result == null)
    echo "Result is empty!";

輸出:

Result is empty!

信息:

  • PHP:版本 7.3.5
  • 數據庫:MySQL

解決此問題的三個建議:

  1. 將您的cours.id_promo = (SELECT ...更改為cours.id_promo IN (SELECT...並對其后的行執行相同操作。為什么?如果您使用=並且內部選擇語句返回多個結果,則繁榮。查詢失敗。SQL是,在它的心臟,一組處理語言,而this IN that將檢查this是一組成員that

  2. 回顯您的$sql值以確保其中的語句是正確的。 嘗試通過 phpmyadmin 運行確切的語句以確保它提供您期望的內容。

  3. 你有這個

  if($result == null) 
      echo "Result is empty!";

改成這個

  if(!$result) 
      echo 'sql failure:', $conn->error, ': ', $sql;  

query()方法僅在查詢失敗時返回錯誤結果。 如果它成功但沒有找到匹配的行,則query()返回一個空結果集。 因此,只要您的 $result 為假,您就在查詢中犯了一個編程錯誤。 我提到的echo會為你診斷。

專業提示始終檢查 SQL 操作是否有錯誤。

專業提示 2 將您的 SQL 技能帶入 21 世紀。 使用顯式連接操作而不是舊式的逗號連接操作。 改變 ...

SELECT cours.jour, whatever, whatever 
  FROM cours 
  JOIN promotion   ON cours.id_promo = promotion.id_promo
  JOIN enseignant  ON cours.id_ens = enseignant.id_en
  JOIN modules     ON cours.id_mod = modules.id_mod
  JOIN salles      ON cours.id_salle = salles.id_salle
 WHERE cours.id_promo IN (SELECT id_promo FROM promotion WHERE promotion.niveau = '2')
   AND promotion.id_speci IN (SELECT id_speci FROM spécialité WHERE nom_speci = 'MGL') 
 ORDER BY cours.id_cours

通過這種方式,您的表之間的關系更容易閱讀和理解。 而且,如果您的應用程序需要,您可以將JOIN更改為LEFT JOIN

只是一個建議。

代替嵌套舊的基於隱式連接語法的列表表,where 子句和嵌套子查詢應該使用顯式連接語法。

SELECT cours.jour
  , TIME_FORMAT(cours.heure_debut, '%H:%i') AS debut
  , TIME_FORMAT(cours.heure_fin, '%H:%i') AS fin
  , enseignant.nom_ens as prof
  , modules.nom_mod as module
  , salles.nom_salle as salle
FROM cours
INNER JOIN promotion ON cours.id_promo = promotion.id_promo
  AND  promotion.niveau = '2'  
INNER JOIN enseignant ON  cours.id_ens = enseignant.id_ens
INNER JOIN modules cours.id_mod = modules.id_mod 
INNER JOIN salles  ON cours.id_salle = salles.id_salle 
ORDER BY cours.id_cours;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM