繁体   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