1

以下脚本可以正常工作,但我不喜欢它,因为它不优雅而且很乱。

无需太高级(意味着我不想要 OOP 风格),我只想以程序方式最小化此代码。主要是我想结合 SQL 查询并清理混乱。

//get page url and query db to find the correct page
$this_page = $_GET['page'];
$this_page = escape_data($_GET['page']);

//Make sure page exists - if it doesn't redirect the browser
$SQL_page_exist = "SELECT * FROM pages_learn_more WHERE page_title = '$this_page'";
$SPE_result = mysql_query($SQL_page_exist);

while ($details = mysql_fetch_array($SPE_result))
{
$page_id          =     $details['id'];
$page_title       =     $details['page_title'];
$main_title       =     $details['main_title'];
$main_content     =     $details['main_content'];
$sub_title        =     $details['sub_title'];
$sub_content      =     $details['sub_content'];    
}

if(mysql_num_rows($SPE_result) == 0) 
{
echo '<META HTTP-EQUIV="Refresh" Content="0; URL=page_not_found.php">';

} else {

$SQL = 
    "SELECT   ptt.tool_tip_link
       FROM   pages_tool_tip ptt
       JOIN   pages_to_pages ptp
         ON   ptp.tool_tip_id = ptt.tool_tip_id
      WHERE   ptp.learn_more_id = '$page_id'";

  $result = mysql_query($SQL); // or die(mysql_error()); 

  //set array for reference_keys variable which may contain 0 to 20 keys
  $reference_keys = array();
  while ($db_field = mysql_fetch_array($result))
{   
 $reference_keys[] =     $db_field['tool_tip_link'];    
}   

好的,所以上面的代码可以正常工作,但它非常难看,过去 2 小时我一直在尝试将其改进为干净、简单和漂亮的东西,但可惜我的技能还没有,我得到的只是 mysql错误。

我最近的尝试是:

$SQL = 
"
     SELECT     *
       FROM     pages_learn_more plm

       JOIN     pages_tool_tip ptt, pages_to_pages ptp 
         ON     ptp.tool_tip_id = ptt.tool_tip_id
      WHERE     plm.page_title = '$this_page' AND ptp.learn_more_id = plm.id 
";

$result = mysql_query($SQL); // or die(mysql_error()); 

$reference_keys = array();
while ($details = mysql_fetch_array($result))
{   
        $reference_keys[] =     $details['tool_tip_link'];  
        $page_id          =     $details['id'];
        $page_title       =     $details['page_title'];
        $main_title       =     $details['main_title'];
        $main_content     =     $details['main_content'];
        $sub_title        =     $details['sub_title'];
        $sub_content      =     $details['sub_content'];    
}

**这就像我第 30 次尝试清理此代码失败。有知识的人可以帮助我,如果可能的话,请解释你的意见......

谢谢 **

附带说明:我什至在 PHPmyAdmin 中尝试了许多查询,这告诉我您的 SELECT of FROM 语句中的表顺序会影响您的结果,例如SELECT pages_learn_more plm, pages_tool_tip ptt!= SELECT pages_tool_tip ptt, pages_learn_more plm 而且我不明白这些语句的顺序如何影响结果。(在完整查询中使用 1 会导致错误,而其他显示表)

如果有帮助,我的数据库方案的图片

在此处输入图像描述

4

2 回答 2

2

你有一个隐式(逗号分隔的表)和显式的奇怪组合JOIN,这会影响表出现的顺序。不鼓励使用隐式连接,所以只使用显式连接。

由于您没有使用所有列,因此不要使用SELECT *,尤其是因为某些表具有相同的列名 ( tool_tip_id),这会导致歧义。相反,请更明确地说明您选择的内容。您甚至可以plm.*用该表中所需的确切列列表替换下面的内容。

$SQL = 
"
     SELECT
       plm.*,
       ptt.tool_tip_link
     FROM
         pages_learn_more plm
         LEFT JOIN pages_to_pages ptp ON plm.id = ptp.learn_more_id
         LEFT JOIN pages_tool_tip ptt ON ptp.tool_tip_id = ptt.tool_tip_id
      WHERE
         plm.page_title = '$this_page'
";

在您的 while 循环中,您访问的唯一列是 ofpages_learn_more和一个 from pages_tool_tip,因此在SELECT列表中,我用于plm.*该表上的所有列,并且ptt.tool_tip_link仅来自另一个表。

由于您的主表似乎在pages_learn_more中可能有或没有关联记录,因此pages_to_pages我替换了 a LEFT JOIN,因此即使它没有关联的工具提示,查询仍然可以返回记录(带有 NULL 工具提示)。

从技术上讲,第二个LEFT JOIN可能只是一个,因为如果一个存在INNER JOIN必须有一个记录。pages_tool_tippages_to_pages

于 2012-07-12T20:45:09.310 回答
0

1)这部分是可疑的。

while ($details = mysql_fetch_array($SPE_result))
{
    $page_id          =     $details['id'];
     ...
}

你期待不止一个结果吗?如果是这样,为什么不修改查询以准确返回您需要的结果。您可以使用 LIMIT 1、ORDER BY {field} DESC、WHERE ... 等。如果您只期望一个结果,请使用 if 而不是 while。

2)这个条件应该在数据提取之前上移。

if(mysql_num_rows($SPE_result) == 0) 
{
echo '<META HTTP-EQUIV="Refresh" Content="0; URL=page_not_found.php">';

} else {
    ... move your mysql_fetch_array($SPE_result) here, and you don't need a conditional for it.

3)“我得到的只是mysql错误”

你得到什么错误?

于 2012-07-12T20:58:43.537 回答