[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с SQL
Andreydial
В поиске был ниче не нашел
на строку
for ($city = current($city_array); $city; $city = next(city_array))
ругается так
Fatal error: Only variables can be passed by reference in Z:\home\test_site\www\create_table.php on line 11

Кусок кода где возникла ошибка
mysql_select_db('mysite', $global_dbh) or die ("Could not select database");
function add_new_country($dbh, $continent, $countryname, $city_array)
{
$country_query = "INSERT INTO country(continent, countryname) VALUES ('$continent', '$countryname')";
$result_id = mysql_query($country_query) or die($country_query . mysql_error());
if ($result_id)
{
$countryID = mysql_insert_id($dbh);
for ($city = current($city_array); $city; $city = next(city_array))
{
$city_query = "INSERT INTO city (countryID, cityname) VALUES ($countryID, '$city')";
mysql_query($city_query, $dbh) or die($city_query . mysql_error());
}
}
}
function populate_cities_db($dbh)

База открыта и выбрана. Помогите пожалуста разобраться. sad.gif
$dbh есть база с именем 'mysite'.



Спустя 26 минут, 51 секунда (23.03.2009 - 15:13) Kuliev написал(а):
Что то я не понял что эта за бред
PHP
<?
for ($city = current($city_array); $city; $city = next(city_array))
{

}

// Может имелось ввиду так 

for ($i 0$i count($city_array); $i++)
{

}

Спустя 5 минут, 18 секунд (23.03.2009 - 15:18) Andreydial написал(а):
С книги пример пишу. Рассматривается массив городов и перебором заносится в таблицу cityname по ячейке countryID.

Спустя 3 минуты, 19 секунд (23.03.2009 - 15:21) Andreydial написал(а):
Если написать так как ты показал, то ошибки выплывают такие
Warning: mysql_insert_id(): supplied argument is not a valid MySQL-Link resource in Z:\home\test_site\www\create_table.php on line 10

$countryID = mysql_insert_id($dbh);

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in Z:\home\test_site\www\create_table.php on line 15
INSERT INTO city (countryID, cityname) VALUES (, '')

mysql_query($city_query, $dbh) or die($city_query . mysql_error());
Это строки на какие ругается

Такие же ошибки возникают, когда просто удалить строку в котрой первоначально возникает ошибка. Но, если вторая ошибка (on line 15) частично мне понятна, то первая (on line 10) совсем нет.

Спустя 4 минуты, 15 секунд (23.03.2009 - 15:26) waldicom написал(а):
Напиши просто, что ты хочешь сделать.

Спустя 23 секунды (23.03.2009 - 15:26) Kuliev написал(а):
Цитата (Andreydial @ 23.03.2009 - 12:18)
С книги пример пишу. Рассматривается массив городов и перебором заносится в таблицу cityname по ячейке countryID.

Сегодня была типа такой темы вот тебе пример!
PHP
<? 
//Создаем массив. Массив может придти и из формы методом POST или GET

$arr = array ("Апельсин","Мандарин","Яблоко","Кокос");

// Делаем цикл FOR

for ($i =0$i count ($arr); $i++)
{
 
// теперь записываем весь массив по элементу в БД

$sql = ("INSERT INTO table VALUE ('','".$arr[$i]."')");
$result mysql_qyery ($sql);

}


Спустя 3 минуты, 10 секунд (23.03.2009 - 15:29) Viking написал(а):
все гораздо проще
Цитата
for ($city = current($city_array); $city; $city = next($city_array))


Спустя 40 секунд (23.03.2009 - 15:30) sergeiss написал(а):
Цитата (Kuliev @ 23.03.2009 - 15:13)
Что то я не понял что эта за бред
PHP
<?
for ($city = current($city_array); $city; $city = next(city_array))
{

}

// Может имелось ввиду так 

for ($i = 0; $i < count($city_array); $i++)
{

}

Это не бред, а нормальное использование возможностей цикла for smile.gif Там вовсе не обязательно цифровые параметры! Это же не Бейсик, а ПХП smile.gif

Вот только автор вопроса, похоже, забыл написать '$' у последнего city_array. Этот знак обязательно должен быть у имени переменной.

PS. В логику скрипта я лично не вникал.

PPS. А Викинг раньше написал smile.gif

Спустя 2 минуты, 42 секунды (23.03.2009 - 15:32) Andreydial написал(а):
Цитата (waldicom @ 23.03.2009 - 12:26)
Напиши просто, что ты хочешь сделать.

Есть база mysite, в ней две таблицы надо создать. В одной $continent и $countryname, в другой массив городов, связанный соответственно с континентов и страной. Часть текста
{
$countryID = mysql_insert_id($dbh);
for ($city = current($city_array); $city; $city = next(city_array))
для меня не понятна в принципе. Я так думаю что ошибка в
$countryID = mysql_insert_id($dbh);
писал $countryID = mysql_insert_id('mysite');
это же ведь одно и тоже, можеть неправильный синтаксис?

Спустя 2 минуты, 1 секунда (23.03.2009 - 15:34) Kuliev написал(а):
sergeiss
Это понятно, что это возможности цикла FOR, но автор содрал код с книжки, а вернее просто перелистал ее дальше середины и начал тупа перепечатывать КОД не поняв что к чему!

100 балов он даже незнаек что за функция current() и что она возвращает!

Спустя 3 минуты, 49 секунд (23.03.2009 - 15:38) twin написал(а):
Цитата
Что то я не понял что эта за бред
Более того, вот это больше на бред похоже:
PHP
for ($i 0$i count($city_array); $i++)
потому что функция count() вызывается при каждой интерации цикла. Нужно бы сначала определить число, записать в переменную и потом уже подставлять в цикл.

Спустя 1 минута, 29 секунд (23.03.2009 - 15:40) Andreydial написал(а):
Спасибо Viking, Sergeiss, таки да слеп. Но теперь также возникает ошибка
Warning: mysql_insert_id(): supplied argument is not a valid MySQL-Link resource in Z:\home\test_site\www\create_table.php on line 10

$countryID = mysql_insert_id($dbh);

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in Z:\home\test_site\www\create_table.php on line 14
INSERT INTO city (countryID, cityname) VALUES (, 'Nairobi')

$city_query = "INSERT INTO city (countryID, cityname) VALUES ($countryID, '$city')";
mysql_query($city_query, $dbh) or die($city_query . mysql_error());
Но город уже вставил, значит все же ошибка в использовании
$countryID = mysql_insert_id($dbh);
потому как он не возвращает значение. Просто первый раз в первый класс, а в книге не очень понятно написано про mysql_insert_id

Спустя 2 минуты, 25 секунд (23.03.2009 - 15:42) Andreydial написал(а):
Цитата (Kuliev @ 23.03.2009 - 12:34)
sergeiss
Это понятно, что это возможности цикла FOR, но автор содрал код с книжки, а вернее просто перелистал ее дальше середины и начал тупа перепечатывать КОД не поняв что к чему!

100 балов он даже незнаек что за функция current() и что она возвращает!

Не надо оскорблений, я тебя не знаю ты меня, почему говоришь что я тупо стал первый попавшийся код писать.

Спустя 22 секунды (23.03.2009 - 15:43) Kuliev написал(а):
twin
Ну и что, что она вызывается при каждой итерацией, можешь ее использовать перед циклом она вернет тебе количество элементов!

В чем спор собственно?

Спустя 1 минута, 38 секунд (23.03.2009 - 15:44) Kuliev написал(а):
Andreydial
А я тебя и не оскорбляю, я же тебя не обозвал как нибудь и не послал!!!
Я выразил свое мнение по поводу твоего выложенного куска кода!
БЕЗ ОБИД!!! huh.gif

Спустя 2 минуты, 3 секунды (23.03.2009 - 15:46) Grey написал(а):
PHP
$countryID = mysql_insert_id($dbh);

Это берет из базы id страны, после того как страна была занесена в базу после этого запроса:
PHP
$country_query = "INSERT INTO country(continent, countryname) VALUES ('$continent', '$countryname')";


берется для того, чтобы записаться в базу в этом запросе:
PHP
$city_query "INSERT INTO city (countryID, cityname) VALUES ($countryID, '$city')";


а это
PHP
mysql_query(): supplied argument is not a valid MySQL-Link resource in Z:hometest_sitewwwcreate_table.

всетки говорит о том что соединения с базой не получилось.

Спустя 2 минуты, 8 секунд (23.03.2009 - 15:48) twin написал(а):
Цитата
В чем спор собственно?
Спора никакого нет собственно, просто режет глаз неоптимальное применение функций. Может это косметика конечно, но как говорится: лучше делать хорошо, плохо оно само получится biggrin.gif

Спустя 37 секунд (23.03.2009 - 15:49) Kuliev написал(а):
Цитата (Andreydial @ 23.03.2009 - 12:32)

Есть база mysite, в ней две таблицы надо создать. В одной $continent и $countryname, в другой массив городов, связанный соответственно с континентов и страной.

А вот с это момента можешь по подробней, а то как то смутно представляю себе!

Спустя 2 минуты, 11 секунд (23.03.2009 - 15:51) twin написал(а):
Попробуй mysql_insert_id() без аргумента, она возвращает id последней записи.

Спустя 23 секунды (23.03.2009 - 15:52) Andreydial написал(а):
Цитата (Grey @ 23.03.2009 - 12:46)
PHP
$countryID = mysql_insert_id($dbh);

Это берет из базы id страны, после того как страна была занесена в базу после этого запроса:
PHP
$country_query = "INSERT INTO country(continent, countryname) VALUES ('$continent', '$countryname')";


берется для того, чтобы записаться в базу в этом запросе:
PHP
$city_query = "INSERT INTO city (countryID, cityname) VALUES ($countryID, '$city')";


а это
PHP
mysql_query(): supplied argument is not a valid MySQL-Link resource in Z:hometest_sitewwwcreate_table.

всетки говорит о том что соединения с базой не получилось.

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in Z:\home\test_site\www\create_table.php on line 14
INSERT INTO city (countryID, cityname) VALUES (, 'Nairobi')
После слова VALUES вместо countryID пробел, те не присвоено значение countryID. А соединение с базой установлено, и таблицы обе созданы, я в PHPMyAdmin посмотрел, они есть, изначально их не было.

Спустя 2 минуты, 8 секунд (23.03.2009 - 15:54) Grey написал(а):
таблицы-то есть
А есть там поле id auto incremet?
и id будет выводиться только тогда когда что-то уже внесено в базу. При пустой таблице конечно не выведет.

Спустя 2 минуты, 26 секунд (23.03.2009 - 15:56) Kuliev написал(а):
Andreydial
А дамп базы можешь показать что там у тебя и какая структура???

Спустя 1 минута, 52 секунды (23.03.2009 - 15:58) Andreydial написал(а):
Цитата (Grey @ 23.03.2009 - 12:54)
таблицы-то есть
А есть там поле id auto incremet?
и id будет выводиться только тогда когда что-то уже внесено в базу. При пустой таблице конечно не выведет.

mysql_query("CREATE TABLE country (ID int not null auto_increment primary key, continent varchar(50), countryname varchar(50))", $dbh) or die(mysql_error());
mysql_query("CREATE TABLE city (ID int not null auto_increment primary key, countryID int not null, cityname varchar(50))", $dbh) or die(mysql_error());


Спустя 42 секунды (23.03.2009 - 15:59) sergeiss написал(а):
Цитата (Kuliev @ 23.03.2009 - 15:43)
twin
Ну и что, что она вызывается при каждой итерацией, можешь ее использовать перед циклом она вернет тебе количество элементов!

В чем спор собственно?

Проблема в том, что предложенный тобой вариант
PHP
for ($i =0$i count ($arr); $i++)
{
 
// теперь записываем весь массив по элементу в БД

$sql = ("INSERT INTO table VALUE ('','".$arr[$i]."')");
$result mysql_qyery ($sql);

}

будет корректно работать только в ограниченном количестве случаев, когда строго выполняются несколько условий одновременно:
1. Индексы массива - целые числа от 0 и до максимума
2. В индексах нету пропусков.

Это хорошо в Си++, но не в ПХП. Потому что в ПХП могут быть и индексы пропущены (т.е. не сплошной цифровой ряд), и индексы могут быть вообще нецифровыми (называются ассоциативными).

Поэтому написанный автором темы цикл является более корректным (с учетом добавки знака $ в том месте, где он был пропущен).

Спустя 1 минута, 24 секунды (23.03.2009 - 16:00) Andreydial написал(а):
Цитата (twin @ 23.03.2009 - 12:51)
Попробуй mysql_insert_id() без аргумента, она возвращает id последней записи.

Теперь ошибка изменилась
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in Z:\home\test_site\www\create_table.php on line 14
INSERT INTO city (countryID, cityname) VALUES (1, 'Nairobi')

теперь VALUES стоит 1, но воз на месте.

Спустя 36 минут, 18 секунд (23.03.2009 - 16:36) Andreydial написал(а):
Таблицу страны заполняет первым значением континента и страны
$country_query = "INSERT INTO country(continent, countryname) VALUES ('$continent', '$countryname')";
$result_id = mysql_query($country_query) or die($country_query . mysql_error());
это проверено, есть записи в таблице,
а вот названия городов вносить не хочет. $countryID это переменная, которая ассоциирует массив городов с данной конкретной страной. Структура второй таблицы создана, те присутствует и ID и countryID, и cityname

Спустя 15 минут, 3 секунды (23.03.2009 - 16:51) sergeiss написал(а):
Покажи код, какой у тебя получился в итоге. Иначе сложно уже ориентироваться.

Спустя 6 минут, 25 секунд (23.03.2009 - 16:58) Andreydial написал(а):
Цитата (sergeiss @ 23.03.2009 - 13:51)
Покажи код, какой у тебя получился в итоге. Иначе сложно уже ориентироваться.

Я так понял весь, ибо он небольшой
<?php
$global_dbh = mysql_connect('localhost', 'root') or die ("Could not connect to database");
mysql_select_db('mysite2', $global_dbh) or die ("Could not select database");
function add_new_country($dbh, $continent, $countryname, $city_array)
{
$country_query = "INSERT INTO country(continent, countryname) VALUES ('$continent', '$countryname')";
$result_id = mysql_query($country_query) or die($country_query . mysql_error());
if ($result_id)
{
$countryID = mysql_insert_id($dbh);
for ($city = current($city_array); $city; $city = next($city_array))
{
$city_query = "INSERT INTO city (countryID, cityname) VALUES ($countryID, '$city')";
mysql_query($city_query, $dbh) or die($city_query . mysql_error());
}
}
}
function populate_cities_db($dbh)
//Уничтожить все таблицы, если они есть
{
mysql_query("DROP TABLE city", $dbh);
mysql_query("DROP TABLE country", $dbh);
//Создать таблицы
mysql_query("CREATE TABLE country (ID int not null auto_increment primary key, continent varchar(50), countryname varchar(50))", $dbh) or die(mysql_error());
mysql_query("CREATE TABLE city (ID int not null auto_increment primary key, countryID int not null, cityname varchar(50))", $dbh) or die(mysql_error());
//Ввести данные в таблицу
add_new_country('mysite2', 'Africa', 'Kenya', array('Nairobi', 'Mambasa', 'Maru'));
add_new_country('mysite2', 'South America', 'Brasil', array('Rio de Janeiro', 'Sao Paulo', 'Salvador', 'Belo Horisonte'));
add_new_country('mysite2', 'North America', 'USA', array('Chikago', 'New York', 'Houston', 'Miami'));
add_new_country('mysite2', 'Nort America', 'Canada', array('Montreal', 'Windsor', 'Winnipeg'));
print("Sample database created<br>");
}
?>
<html><head><title>Creating a sample database</title></head>
<body>
<?php populate_cities_db($global_dbh); ?>
</body>
</html>

Спустя 27 минут, 42 секунды (23.03.2009 - 17:26) sergeiss написал(а):
Если только попробовать поменять цикл
PHP
for ($city current($city_array); $city$city next($city_array))

на цикл
PHP
foreach( $city_array as $k => $city )

сохранив при этом всё содержимое цикла.

У тебя же названия городов просто не вносятся, но ошибок нету?

Спустя 4 минуты, 17 секунд (23.03.2009 - 17:30) Andreydial написал(а):
Не, те же яйца
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in Z:\home\test_site\www\create_table.php on line 15
INSERT INTO city (countryID, cityname) VALUES (1, 'Nairobi')

Спустя 6 минут, 55 секунд (23.03.2009 - 17:37) sergeiss написал(а):
Ну так ЁРПСТ!!! mad.gif mad.gif mad.gif
Это что такое???
PHP
add_new_country('mysite2''Africa''Kenya', array('Nairobi''Mambasa''Maru'));

а должно быть так:
PHP
add_new_country$dbh'Africa''Kenya', array('Nairobi''Mambasa''Maru'));

И так во всех строках с вызовом этой функции.

Спустя 7 минут, 46 секунд (23.03.2009 - 17:45) Andreydial написал(а):
УРА! Всем спасибо большое, без вас я бы все равно не разобрался! в строке
mysql_query($city_query, $dbh) or die($city_query . mysql_error());
параметр $dbh не нужен, ошибка в книге.

Спустя 1 минута, 53 секунды (23.03.2009 - 17:46) Andreydial написал(а):
Цитата (sergeiss @ 23.03.2009 - 14:37)
Ну так ЁРПСТ!!! mad.gif mad.gif mad.gif
Это что такое???
PHP
add_new_country('mysite2', 'Africa', 'Kenya', array('Nairobi', 'Mambasa', 'Maru'));

а должно быть так:
PHP
add_new_country( $dbh, 'Africa', 'Kenya', array('Nairobi', 'Mambasa', 'Maru'));

И так во всех строках с вызовом этой функции.

Какая разница, я явно задал имя базы данных, а не через переменную. Хотя спасибо, надо теперь в первоначальный вид привести.

Спустя 10 минут, 8 секунд (23.03.2009 - 17:57) sergeiss написал(а):
Вот смотри. Ты передаешь как параметр УКАЗАТЕЛЬ на открытую БД, судя по использованию. Но при этом пытался передавать какую-то строку. Вот у тебя и была ошибка. И не важно, что это название "чего там".
Что касается второго параметра mysql_query($city_query, $dbh), то это не ошибка вовсе. Главное, чтобы параметр сам по себе правильный.

Спустя 3 минуты, 16 секунд (23.03.2009 - 18:00) Andreydial написал(а):
Но почему тогда без $dbh скрипт работает и в таком виде
add_new_country($dbh, 'Africa', 'Kenya', array('Nairobi', 'Mambasa', 'Maru'));
и в таком виде
add_new_country('mysite2', 'Africa', 'Kenya', array('Nairobi', 'Mambasa', 'Maru'));

Спустя 4 минуты, 29 секунд (23.03.2009 - 18:04) sergeiss написал(а):
Потому что если ты исключаешь $dbh из вызовов mysql_query, то тогда обращаешься (по умолчание) к последней использованной открытой БД.
При этом первый параметр внутри функции add_new_country просто не используется!!!
Поэтому скрипт и работает.

Спустя 5 минут, 13 секунд (23.03.2009 - 18:09) Andreydial написал(а):
Почему тогда в первоначальнов варианте (с $dbh) скрипт не работал ни в одно ни в другом варианте. Да и в книге первое обращение
$country_query = "INSERT INTO country(continent, countryname) VALUES ('$continent', '$countryname')";
$result_id = mysql_query($country_query) or die($country_query . mysql_error());
написано без $dbh, а второе с $dbh(которое ошибку давало).
В общем завтра продолжим общение, если не против, хотелось бы поставить точки и разобраться полностью, может я чего недопонял.

Спустя 2 часа, 50 секунд (23.03.2009 - 20:10) sergeiss написал(а):
Для ответов на такие "почему" надо знать весь текст. Тот, который не работал. Целиком и полностью.
Но "надо" не означает, что кто-то будет в нем разбираться smile.gif Я предоставляю это почетное право тебе. Главное, что сейчас получили рабочий вариант. И уже исходя из него ты можешь самостоятельно проанализировать, найти и попытаться объяснить разницу. Это будет очень полезно с точки зрения изучения языка.

Спустя 15 часов, 7 минут, 17 секунд (24.03.2009 - 11:18) Andreydial написал(а):
Странно все это, сегодня и в первоначальном варианте все класно работает. Либо планеты не стали, либо я не знаю.

Спустя 1 день, 6 часов, 31 минута, 9 секунд (25.03.2009 - 17:49) DMX написал(а):
Не буду новую тему открывать, поэтому спрошу здесь, ибо вопрос по запросу. Есть таблица с именами юзеров и постов, т.е. каждому посту приписывается юзер. Как мне вывести из неё юзеров, чтобы они не повторялись? или всё же перейти на 2 таблицы?

Спустя 2 часа, 59 минут, 17 секунд (25.03.2009 - 20:48) Kuliev написал(а):
Цитата (DMX @ 25.03.2009 - 14:49)
Не буду новую тему открывать, поэтому спрошу здесь, ибо вопрос по запросу. Есть таблица с именами юзеров и постов, т.е. каждому посту приписывается юзер. Как мне вывести из неё юзеров, чтобы они не повторялись? или всё же перейти на 2 таблицы?

Я бы в 2 таблицы сделал! А потом запросом вытаскивал то что мне нужно!

Спустя 1 час, 33 минуты, 4 секунды (25.03.2009 - 22:21) sergeiss написал(а):
Цитата (DMX @ 25.03.2009 - 17:49)
Не буду новую тему открывать, поэтому спрошу здесь....

Лучше впредь новую тему делай. Иначе каша будет, а не ответы. Особенно, если кто-то начнет отвечать не тебе, а "топикстартеру".

По сути вопроса - однозначно 2 таблицы.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.