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

暗黙的(コンマ区切りのテーブル)と明示的JOINsの奇妙な組み合わせがあり、テーブルが表示される順序に影響します。暗黙的結合は推奨されないため、明示的結合のみを使用してください。

すべての列を使用しているわけではないので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ループでは、アクセスする列はの列とpages_learn_moreからの列のみpages_tool_tipであるため、SELECTリストでは、plm.*そのテーブルのすべての列に使用しptt.tool_tip_link、他のテーブルからのみ使用しました。

プライマリテーブルには、にpages_learn_more関連付けられたレコードがある場合とない場合があるように見えるためpages_to_pages、を置き換えましたLEFT JOIN。関連付けられたツールチップがない場合でも、クエリはレコードを返す可能性があります(ツールチップがNULLの場合)。

技術的には、レコードが存在する場合はレコードが存在する必要があるため、2番目LEFT JOINは単なるレコードである可能性があります。INNER JOINpages_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 ...などを使用できます。1つの結果のみを期待する場合は、whileの代わりにifを使用します。

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 に答える