9

运行此程序时出现错误“未声明的变量:临时”...

<?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_*在新代码中使用函数。它们不再被维护并被正式弃用。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 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

我喜欢使用 heredoc 来帮助我构建嵌入式 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;

然后,如果您想更正第二个查询而不列出要插入记录的表的字段,则必须以相同的顺序列出字段。

这次只是查询:

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

第二个查询不正确。

从参考 -

MySQL 服务器不支持 SELECT ... INTO TABLE Sybase SQL 扩展。相反,MySQL 服务器支持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 回答