Я получаю сообщение об ошибке «uneclared variable: 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( ) );
Есть идеи ?
Пожалуйста, не используйте функции 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());
Второй запрос неверен.
Из ссылки –
MySQL Server не поддерживает 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'
Мне нравится использовать 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), просто потому, что он находится в одном файле сценария, не обязательно означает, что это одно и то же соединение, так что к моменту выполнения вашего запроса на вставку ваша временная таблица не будет видна этому соединению сессия.
Попробуйте выполнить все запросы, отправьте все это в рамках выполнения одной команды / запроса.
Удачи.