[英]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!
信息:
解決此問題的三個建議:
將您的cours.id_promo = (SELECT ...
更改為cours.id_promo IN (SELECT...
並對其后的行執行相同操作。為什么?如果您使用=
並且內部選擇語句返回多個結果,則繁榮。查詢失敗。SQL是,在它的心臟,一組處理語言,而this IN that
將檢查this
是一組成員that
。
回顯您的$sql
值以確保其中的語句是正確的。 嘗試通過 phpmyadmin 運行確切的語句以確保它提供您期望的內容。
你有這個
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.