9

これを実行すると、「宣言されていない変数:temp」というエラーが発生します...

<?php 

$maketemp = "CREATE TEMPORARY TABLE temp(`itineraryId` int NOT NULL, `live` varchar(1), `shipCode` varchar(10), `description` text, `duration` varchar(10), PRIMARY KEY(itineraryId))"; 

mysql_query( $maketemp, $connection ) or die ( "Sql error : " . mysql_error ( ) );

$inserttemp = "SELECT live, id AS itineraryId, ship AS shipCode, description AS description, duration AS length FROM cruises WHERE live ='Y' INTO temp";

mysql_query( $inserttemp, $connection ) or die ( "Sql error : " . mysql_error ( ) );

$select = "SELECT intineraryId, shipCode, description, duration FROM temp";

$export = mysql_query ( $select, $connection ) or die ( "Sql error : " . mysql_error( ) );

何か案は ?

4

3 に答える 3

13

mysql_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に非推奨です赤いボックスがか? 代わりにプリペアド ステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事は、どちらを決定するのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。


このコードは動作するはずです:

<?php

  $maketemp = "
    CREATE TEMPORARY TABLE temp_table_1 (
      `itineraryId` int NOT NULL,
      `live` varchar(1),
      `shipCode` varchar(10),
      `description` text,
      `duration` varchar(10),
      PRIMARY KEY(itineraryId)
    )
  "; 

  mysql_query($maketemp, $connection) or die ("Sql error : ".mysql_error());

  $inserttemp = "
    INSERT INTO temp_table_1
      (`itineraryId`, `live`, `shipCode`, `description`, `duration`)
    SELECT `id`, `live`, `ship`, `description`, `duration`
    FROM `cruises`
    WHERE `live` = 'Y'
  ";

  mysql_query($inserttemp, $connection) or die ("Sql error : ".mysql_error());

  $select = "
    SELECT `itineraryId`, `shipCode`, `description`, `duration`
    FROM temp_table_1
  ";
  $export = mysql_query($select, $connection) or die ("Sql error : ".mysql_error());

一時テーブルでさらに多くのことを行うか、それで遊んでいるだけだと思いますが、コード全体を次のように要約できることに注意してください。

<?php

  $query = "
    SELECT `id` AS 'itineraryId', `ship`, `description`, `duration`
    FROM `cruises`
    WHERE `live` = 'Y'
  ";
  $export = mysql_query($query, $connection) or die ("Sql error : ".mysql_error());
于 2012-04-27T09:54:51.663 に答える
1

ヒアドキュメントを使用して、埋め込み SQL クエリを作成するのが好きです (微妙なエラーを目立たせるのに役立つだけです)。したがって、最初のクエリは次のようになります。

$maketemp =<<<s
CREATE TEMPORARY TABLE temp(
`itineraryId` int NOT NULL,
`live` varchar(1), 
`shipCode` varchar(10),
`description` text,
`duration` varchar(10),
PRIMARY KEY(itineraryId));
s;

次に、レコードを挿入するテーブルのフィールドをリストせずに 2 番目のクエリを修正する場合は、フィールドを同じ順序でリストする必要があります。

今回はクエリのみ:

INSERT INTO temp
SELECT id, live, ship, description, duration
FROM cruises
WHERE live = 'y';

そして、一時変数に関する最後のことは次のとおりです。その可視性に関する部分を確認してください。テーブルの作成時に TEMPORARY キーワードを使用できます。TEMPORARY テーブルは、現在の接続に対してのみ表示され、接続が閉じられると自動的に削除されます。 http://dev.mysql.com/doc/refman/5.5/en/create-table.html

つまり、MySQL に直接接続している場合 (たとえば、次のようなコマンド ライン インターフェイスを介して):

mysql> #our query here line-by-line

次に、セッションがアクティブである限り、基本的に複数のクエリすべてを通じて同じ接続を使用します。

ただし、外部スクリプト (たとえば、PHP など) では、同じスクリプト ファイル上にあるからといって、必ずしも同じ接続であるとは限らないため、挿入クエリを実行するまでに、一時テーブルはその接続に表示されません。セッション。

すべてのクエリを連結し、単一のコマンド/クエリの実行内ですべてを送信してください。

幸運を。

于 2012-04-27T10:10:00.970 に答える
0

2 番目のクエリは正しくありません。

参考より~

MySQL サーバーは、SELECT ... INTO TABLE Sybase SQL 拡張機能をサポートしていません。代わりに、MySQL Server はINSERT INTO ... SELECTをサポートしています。標準の SQL 構文であり、基本的には同じものです。

代わりにこれを試してください -

INSERT INTO temp
SELECT live
     , id AS itineraryId
     , ship AS shipCode
     , description AS description
     , duration AS length
FROM
  cruises
WHERE
  live = 'Y'
于 2012-04-27T09:37:53.157 に答える