RFpro.ru: Программирование на PHP

  Все выпуски  

RusFAQ.ru: Программирование на PHP


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / PHP

Выпуск № 352
от 26.05.2006, 23:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 305, Экспертов: 50
В номере:Вопросов: 4, Ответов: 12


Вопрос № 43722: Здравствуйте, уважаемые эксперты! Нужна ваша помощь. Есть две таблицы MySQL. Одна - страны-производители(id, country), в другой - товары(id, country_id). Строю список checkbox`ов из стран(см. приложение). Подскажите, пожалуйста, как сформировать запр...
Вопрос № 43731: Здравствуйте, эксперты! Помогите найти ошибку. При выполнении кода выдает, что не возможно выполнить запрос, хотя к базе данных подключается нормально, и таблица, в которую нужно занести тоже открывается и дает к себе доступ....
Вопрос № 43765: Здравствуйте. Сегодня выгрузил скрипт на unix сервер (на локалке стоял под win32). Очень интересно получается: 1. $DateCreated = "28-05-2004"; list( $day, $month, $year ) = explode( "-", $DateCreated ); $DateCr...
Вопрос № 43776: Добрый вечер! У меня такой вопрос: можно ли сделать так чтобы только один посетитель мог внести изменения в файл на .php? Т.е. сначала первый вносит изменения, потом второй, потом третий и т.д. а не вместе, чтобы каждый последующий видел изменение пр...

Вопрос № 43.722
Здравствуйте, уважаемые эксперты! Нужна ваша помощь. Есть две таблицы MySQL. Одна - страны-производители(id, country), в другой - товары(id, country_id). Строю список checkbox`ов из стран(см. приложение). Подскажите, пожалуйста, как сформировать запрос для выборки товаров выбранных стран(возможно, еще нужно сменить способ построения списка группы checkox`ов)? Заранее благодарен!

Приложение:

Отправлен: 21.05.2006, 09:18
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Устинов Сергей Евгеньевич
Здравствуйте, Андрющенко Вячеслав Васильевич!

В форму добавляешь также скрытые поля:
1. Поле MinId (минимальный номер идентификатора страны)
2. Поле MaxId (максимальный номер идентификатора страны)
Будем считать, что форма передается методом POST, а таблица товары называется tovary :)
<form action="select.php" method=post>
В файле select.php тогда должен быть подобный скрипт:
<?php
if isset(isset($_POST["MinID"]) and isset($_POST["MaxID"]))
{
$query="SELECT * FROM `tovary` WHERE";
for ($id=$_POST["MinID"],$id<=$_POST["MaxID"])
{
if (isset($_POST[$id]) and $_POST[$id])=="on")
{
$query=$query."`country_id`=".$id." OR";
}
}
$query=$query." 1=2"
}
?>

В конце $query - это твой запрос для выборки.

Я добавляю в $query в конце 1=2 на тот случай если не выбрано ни одного checkboxa.
В этом случае после WHERE в запросе не будет ничего и MySQL будет долго ругаться :)
А от того что я добавляю заведомо ложное условия результат не изменится.

Удачи!!!

Приложение:

---------
Ответы на все вопросы - на сайте www.ya.ru :)

Ответ отправил: Устинов Сергей Евгеньевич (статус: 10-ый класс)
Ответ отправлен: 21.05.2006, 11:10

Отвечает: Константин
Здравствуйте, Андрющенко Вячеслав Васильевич!
А где ты берешь список нужных стран?
Допустим, нужно выбрать страны 1, 5, 26
Тогда запрос такой:
$sql = 'SELECT goods.id AS GoodID
FROM suppliers INNER JOIN goods ON suppliers.id=goods.country_id
WHERE suppliers.id = 1 OR suppliers.id = 5 OR suppliers.id = 26'
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result))
{
echo $row['GoodID']."<br> ";
}

Это выведет все товары, которые производят в странах с ID 1, 5, 26
Как работает SQL? Мы объединяем 2 таблицы по ID, потом выбираем нужные строки (т.е. с нужным ID)
После этого говорим что в запросе нам нужно только одно поле - ID товара, которое нам удобно называть по GoodID. Все. Потом уже идет пхп.
Посмотри справочники по SQL. И попробуй сложные SELECT-запросы в phpMyAdmin. Помогает :) Удачи.
---------
Лучше сделать и жалеть, чем жалеть о том что не сделал
Ответ отправил: Константин (статус: 5-ый класс)
Ответ отправлен: 21.05.2006, 11:54

Отвечает: PVS
Здравствуйте, Андрющенко Вячеслав Васильевич!

Попробуйте таким способом:
echo "<form (с атрибутами)>";
$result = mysql_query('SELECT * FROM countries');
while ($row = mysql_fetch_array($result))
{
echo "<input type='checkbox' name='selected_country[]' value=".$row['id'].">".$row['country']."<br>";
";
}

А анализировать надо так:

$country_list=implode(",", $_REQUEST["selected_country"]);
$result = mysql_query('SELECT * FROM goods where country_id in (".$country_list.")');
Ответ отправил: PVS (статус: 1-ый класс)
Ответ отправлен: 22.05.2006, 10:30


Вопрос № 43.731
Здравствуйте, эксперты!
Помогите найти ошибку.
При выполнении кода выдает, что не возможно выполнить запрос, хотя к базе данных подключается нормально, и таблица, в которую нужно занести тоже открывается и дает к себе доступ.

Приложение:

Отправлен: 21.05.2006, 11:32
Вопрос задал: Godal (статус: 2-ой класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Устинов Сергей Евгеньевич
Здравствуйте, Godal!
Все поля, которые у Вас не числового типа нужно заключать в кавычки.
Т. е. Ваш запрос после его формирования выглядит так (echo $sql;):
INSERT INTO avans (data, sum, naim, kolvo, kategoria) VALUES (ddd,ddd,fff,gfhh,ffff);
(В скобочках значения для примера), а нужно вот так:
INSERT INTO avans (data, sum, naim, kolvo, kategoria) VALUES ('ddd','ddd','fff','gfhh','ffff');
Числовые поля не обязательно заключать в кавычки. Я посчитал, что у Вас поле sum числовое, а остальные - нет. Запрос должен выглядеть так:
$sql = "INSERT INTO avans (data, sum, naim, kolvo, kategoria) VALUES ('" . $_datadb[$i] . "'," . $_sum[$i] . ",'" . $_naim[$i] . "','" . $_kolvo[$i] . "','" . $_kateg[$i] . "')";
---------
Ответы на все вопросы - на сайте www.ya.ru :)
Ответ отправил: Устинов Сергей Евгеньевич (статус: 10-ый класс)
Ответ отправлен: 21.05.2006, 11:41
Оценка за ответ: 5
Комментарий оценки:
Сделал как Вы сказали, все работает. Спасибо.

Отвечает: Константин
Здравствуйте, Godal!
А типы всех полей - целочисленные?
Кавычки не стоят.
И MySQL выполняет запрос
INSERT INTO avans (data, sum, naim, kolvo, kategoria) VALUES (datadb, sum, naim, kolvo, kateg)
Если datadb, sum, naim, kolvo, kateg - это целые числа и data, sum, naim, kolvo, kategoria - это целочисленные поля, тогда причина неизвестна. если нет, то все ясно - надо ставить кавычки вокруг строк.

Т.е. INSERT INTO avans (data, sum, naim, kolvo, kategoria) VALUES ('datadb', 'sum', 'naim', 'kolvo', 'kateg')

А вообще, для отладки можно было изменить код так:
for ($i = 1; $i<=3; $i++)
{
$sql = "INSERT INTO avans (data, sum, naim, kolvo, kategoria) VALUES (" . $_datadb[$i] . "," . $_sum[$i] . "," . $_naim[$i] . "," . $_kolvo[$i] . "," . $_kateg[$i] . ")";
if (!mysql_query($sql, $rc))
{
echo "Не могу выполнить запрос $sql<br>";
}
}
И ты бы увидел, что у тебя получается. Если ошибка в запросене видна, беремэтот запрос и выполняем в phpMyAdmin (я такделаю) или в консоли MySQL. Оба варианта говорят, в чем ошибка.

Еще ошибка может быть, если у пользователя test_lordfa нет прав на вставку в БД test_lordfa в таблицу avans.
---------
Лучше сделать и жалеть, чем жалеть о том что не сделал
Ответ отправил: Константин (статус: 5-ый класс)
Ответ отправлен: 21.05.2006, 15:16

Отвечает: Alexey Vilchinsky
Здравствуйте, Godal!
возможно у вас есть в таблице текстовые поля (при выполнении запроса их значения надо брать в одинарные кавычки 'привет').
Если все поля числовые, то проверьте, возможно у вас потерялось какое то значение и там пусто либо не число, тогда естественно будет выдаваться ошибка в запросе.
---------
Делая людям добро, мы возвращаем его многократно...
Ответ отправил: Alexey Vilchinsky (статус: 8-ой класс)
Ответ отправлен: 22.05.2006, 08:31

Отвечает: PVS
Здравствуйте, Godal!
Насколько я понимаю $_kateg - текстовые данные. Их в базу надо писать ссответственно как тект (в одиночных кавычках), тоесть Ваш запрос должен выглядеть примерно так:

$sql = "INSERT INTO avans (data, sum, naim, kolvo, kategoria) VALUES (" . $_datadb[$i] . "," . $_sum[$i] . "," . $_naim[$i] . "," . $_kolvo[$i] . ",'" . $_kateg[$i] . "')";

А еще не мешало бы использовать функцию addslashes на случай если строка содержит специальные символы SQL(' и ):

$sql = "INSERT INTO avans (data, sum, naim, kolvo, kategoria) VALUES (" . $_datadb[$i] . "," . $_sum[$i] . "," . $_naim[$i] . "," . $_kolvo[$i] . ",'" . addslashes($_kateg[$i]) . "')";
Ответ отправил: PVS (статус: 1-ый класс)
Ответ отправлен: 22.05.2006, 10:19


Вопрос № 43.765
Здравствуйте. Сегодня выгрузил скрипт на unix сервер (на локалке стоял под win32).
Очень интересно получается:
1.
$DateCreated = "28-05-2004";
list( $day, $month, $year ) = explode( "-", $DateCreated );
$DateCreated = mktime( 0, 0, 0, $month, $day, $year );
результат win32-1085670000, unix-1085691600
на локалке показал одну дату, на реальном другую, почему?

2. Регулярные выражения:
есть функция для проверки не пустого значения из форм:
function _null( $str ) {
if( preg_match( "/w/", $str, $tmp ) ) return false;
else
return true;
}
англиское слово все нормально, русские выдает что форма пустая
почему?

пока вроде все сюрпризы, может кто знает что еще ждет меня:)

Отправлен: 21.05.2006, 18:14
Вопрос задал: Оськин Дмитрий Владимирович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Оськин Дмитрий Владимирович!
1. Не считал, какая разница в этих значениях по времени, но здесь ошибок быть не может. Наиболее вероятные причины: а) Выполнение на локальном компьютере и на сервере велось не одновременно (менее значимый "отрыв"); б) Между вашим локальным временем и временем сервера разница в несколько часов. Например, если вы хоститесь на московских серверах, а сами с Дальнего Востока, то уже пойдёт разница в несколько часов - вот и видимый "разрыв". А вообще - попробуйте выполнить одновременно скрипты у себя и на сервере и посчитать, сколько же минут/часов даст разница.
2. Потому что PHP изначально имеет английский интерфейс и русские он буквы он не знает и изучать пока что не собирается :-) Если хотите проверить, пуста ли строка - сделайте простым способом: if (strlen($str) > 0) { ... строка введена ... } А ещё есть удобные функции: ltrim() - удаляет пробелы из начала строки, rtrim() - из конца, trim() - и начала и из конца.
Удачи!
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на DELPHI: Всё для программиста.
ICQ: 286837644
----
Ответ отправлен: 21.05.2006, 18:44
Оценка за ответ: 3
Комментарий оценки:
Скрипт запускал практически одновременно.
но он же не использует функцию time() а прсто берет с датой и переводит ее в стандартное числовое время. Так почему же проблема с датой

Отвечает: Stamm
Здравствуйте, Оськин Дмитрий Владимирович!
2) Следует включить русскую локаль ф-цией setlocale(). Все параметры спрашивайте у хостера
---------
В день - один, ну два подвига, не больше...
Ответ отправил: Stamm (статус: Студент)
Ответ отправлен: 22.05.2006, 08:22

Отвечает: Alexey Vilchinsky
Здравствуйте, Оськин Дмитрий Владимирович!
1. Возможно на юниксовом серваке стоит другая часовая зона (отличие в 6 часов с твоим временем)
2.
Напиши так
if( preg_match( "/S+/", $str, $tmp ) ) return false;

---------
Делая людям добро, мы возвращаем его многократно...
Ответ отправил: Alexey Vilchinsky (статус: 8-ой класс)
Ответ отправлен: 22.05.2006, 08:36


Вопрос № 43.776
Добрый вечер! У меня такой вопрос: можно ли сделать так чтобы только один посетитель мог внести изменения в файл на .php? Т.е. сначала первый вносит изменения, потом второй, потом третий и т.д. а не вместе, чтобы каждый последующий видел изменение предыдущего, а скажем не первого! Извините, если задал вопрос криво, надеюсь, Вы поняли и сможете мне помочь! Заранее спасибо!
Отправлен: 21.05.2006, 20:02
Вопрос задал: Грицай Алексей Юрьевич (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Alexey Vilchinsky
Здравствуйте, Грицай Алексей Юрьевич!
Я так думаю надо здесь настроить cvs.
---------
Делая людям добро, мы возвращаем его многократно...
Ответ отправил: Alexey Vilchinsky (статус: 8-ой класс)
Ответ отправлен: 22.05.2006, 08:38

Отвечает: Cybernetic_Creature
Здравствуйте, Грицай Алексей Юрьевич!
да есть такая функция.

http://php.net/manual/ru/function.flock.php

она временно блокирует файл, пока работает с ним.
Ответ отправил: Cybernetic_Creature (статус: Специалист)
Ответ отправлен: 22.05.2006, 14:40
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.33 от 25.05.2006
Яндекс Rambler's Top100

В избранное