webew
Войти » Регистрация
 
PHP

проблема с циклом

22 марта 2012, 10:20
Автор: viderga
$mest;
for ($i=1; $i <= $mest; $i++) {
echo "Фамилия: <input type=text name =family><br>";
echo "Имя: <input type=text name=name><br>";
echo "Отчество: <input type=text name=otch><br>";
echo "серия паспорта: <input type=text name=spas><br>";
echo "номер паспорта: <input type=text name=npas><br>";
echo "страна: <input type=text name=strana><br>";
echo "город: <input type=text name=gorod><br>";
echo "гражданство: <input type=text name=grajd><br>";  
echo ("<br>");
 }

echo '<INPUT TYPE=SUBMIT VALUE="Добавить"><br>';
</form>";


цикл работает, выдает количество анкет равное количеству мест, но если анкет несколько, то в бд данные он добавляет только с последней. как сделать чтоб добавлялись все данные?
Добавить комментарий
Отображение комментариев: Древовидное | Плоское

1234ru

Покажите код, который запрос в БД делает.
То, что не убивает нас, делает нас инвалидами.
22.03.2012, 17:46
Ответить
NO USERPIC

viderga

поменяла все вот так
цикл:
for ($i=0; $i < $mest; $i++) {

echo "Фамилия: <input type=text name =family".$i."><br>";
echo "Имя: <input type=text name=name".$i."><br>";
echo "Отчество: <input type=text name=otch".$i."><br>";
echo "серия паспорта: <input type=text name=spas".$i."><br>";
echo "номер паспорта: <input type=text name=npas".$i."><br>";
echo "страна: <input type=text name=strana".$i."><br>";
echo "город: <input type=text name=gorod".$i."><br>";
echo "гражданство: <input type=text name=grajd".$i."><br>";  
echo ("<br>");
 }
echo '<INPUT TYPE=SUBMIT VALUE="Добавить"><br>';
echo "<input name=iii type=hidden value=$i>";

и запрос в бд:
$fa11 = $_POST['family1'];
$fa12 = $_POST['family2'];
$fa13 = $_POST['family3'];
$na11 = $_POST['name1'];
$na12 = $_POST['name2'];
$na13 = $_POST['name3'];
$ot11 = $_POST['otch1'];
$ot12 = $_POST['otch2'];
$ot13 = $_POST['otch3'];
$sp11 = $_POST['spas1'];
$sp12 = $_POST['spas2'];
$sp13 = $_POST['spas3'];
$np11 = $_POST['npas1'];
$np12 = $_POST['npas2'];
$np13 = $_POST['npas3'];
$st11 = $_POST['strana1'];
$st12 = $_POST['strana2'];
$st13 = $_POST['strana3'];
$go11 = $_POST['gorod1'];
$go12 = $_POST['gorod2'];
$go13 = $_POST['gorod3'];
$gr11 = $_POST['grajd1'];
$gr12 = $_POST['grajd2'];
$gr13 = $_POST['grajd3'];

$a = $POST['iii'];
if ($a=1) {
$w1 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa11.'","'.$na11.'","'.$ot11.'","'.$sp11.'",
"'
.$np11.'","'.$st11.'","'.$go11.'","'.$gr11.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w1) or die(mysql_error());}

if ($a=2) {
//elseif ($a=2) {
$w1 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa11.'","'.$na11.'","'.$ot11.'","'.$sp11.'",
"'
.$np11.'","'.$st11.'","'.$go11.'","'.$gr11.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w1) or die(mysql_error());
$w2 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa12.'","'.$na12.'","'.$ot12.'","'.$sp12.'",
"'
.$np12.'","'.$st12.'","'.$go12.'","'.$gr12.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w2) or die(mysql_error());}

else {
$w1 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa11.'","'.$na11.'","'.$ot11.'","'.$sp11.'",
"'
.$np11.'","'.$st11.'","'.$go11.'","'.$gr11.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w1) or die(mysql_error());
$w2 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa12.'","'.$na12.'","'.$ot12.'","'.$sp12.'",
"'
.$np12.'","'.$st12.'","'.$go12.'","'.$gr12.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w2) or die(mysql_error());
$w3 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa13.'","'.$na13.'","'.$ot13.'","'.$sp13.'",
"'
.$np13.'","'.$st13.'","'.$go13.'","'.$gr13.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w3) or die(mysql_error());}

$s = 'select * from uchet';
$s = mysql_query($s) or die(mysql_error());

echo "<table border=1>";
echo "<tr><td>№комнаты</td><td>класс</td><td>кол-во мест</td><td>фамилия</td><td>имя</td><td>отчество</td>
<td>серия</td><td>номер паспорта</td><td>страна</td><td>город</td><td>гражданство</td>
<td>дата заселения</td><td>время</td><td>дата выселения</td><td>время</td><tr>"
;

while ($row = mysql_fetch_array($s))

теперь в бд заносятся данные но если выбрать 2-х местный номер то вносится 3-е пустое поле, если 1-местный номер то вносятся дополнительно 2 пустые записи-_-
22.03.2012, 17:54
Ответить

1234ru

Цитата:
и запрос в бд:
$fa11 = $_POST['family1'];
$fa12 = $_POST['family2'];
$fa13 = $_POST['family3'];


Верующие при виде такого говорят "О, Господи! Что за китайский код??"

У Вас как-то много копипаста. Вам наверняка с этим неудобно работать (если не сейчас, то рано или поздно станет неудобно).

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

(для справки: китайским называется код, содержащий однотипные повторяющиеся фрагменты, незначительно отличающиеся друг от друга; получил свое благодаря практике некоторых программистов из Поднебесной, которые автоматически размножали текст программ, потому что оплата шла за количество написанного программного кода)
То, что не убивает нас, делает нас инвалидами.
22.03.2012, 22:37
Ответить
NO USERPIC

viderga

рада подчерпнуть что-то новое, спасибо)
вообщем это ис гостиницы.. есть таблица uchet, которая содержит все данные о посетителях,в каком номере они проживали, когда заселились и ушли.. каждый номер гостиницы соответствует определенному классу и имеет 1-3 количество мест. соответственно в 2-х местный номер можно поместить 2 человека, можно и одного..
1. код выбора класса и количества мест:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<?phpinclude "conf.php";
echo "<form action=sos.php method=post>";
$w = 'select * from klass';
$w = mysql_query($w) or die(mysql_error());
echo "Класс: ";
echo "<select class=input type=text name='klass'>";
    while ($row = mysql_fetch_array($w)) {
        $klass = $row['klass'];
        $id_klass = $row['id_klass'];
        echo "<option value='$id_klass'>";
        echo $klass;
  }
echo "</select><br>";
$s = "select * from mesta";
$s = mysql_query($s) or die(mysql_error());
echo "Количество мест: ";
echo "<select class=input type=text name='mesta'>";
    while ($rows = mysql_fetch_array($s)) {
        $mesta = $rows['mesta'];
        $id_mesta = $rows['id_mesta'];
        echo "<option value=$id_mesta>";
        echo $mesta;
    }
echo "</select><br>";
echo "<td><input type=submit value=Оформить></form>";
?>

2. далее видим таблицу с номерами(тут должны быть только свободные на данный момент номера, отсюда вытекал мой вопрос о том, как запретить запись):
<?php
include "conf.php";
$q = $_POST['klass'];
$w = $_POST['mesta'];
 $querys = ('SELECT *
 FROM number, mesta, klass
 WHERE number.id_mesta=mesta.id_mesta and number.id_klass=klass.id_klass and
 number.id_mesta="'
.$w.'" and number.id_klass="'.$q.'"
 and number.id_number NOT IN (
   SELECT id_number
   FROM uchet
   WHERE NOW()
   BETWEEN ADDTIME(CONCAT(data_zas, '
00:00:00 ' ), time_zas)
   AND ADDTIME(CONCAT(data_v, '
00:00:00 '), time_v)');
$querys = mysql_query($querys) or die(mysql_error());
echo "<table border=\"1\" width=\"70%\" bgcolor=\"lavenderblush\">";
echo "<tr><td><B>номер комнаты</B></td><td><B>класс</B></td><td><B>количество мест</B></td>";
while ($myrow = mysql_fetch_array($querys)){
$id_mesta=$myrow['id_mesta'];
$id_klass=$myrow['id_klass'];
$id_number=$myrow['id_number'];
$number=$myrow['number'];
$klass=$myrow['klass'];
$mesta=$myrow['mesta'];
echo "<tr>";
echo "<td>$number</td>";
echo "<td>$klass</td>";
echo "<td>$mesta</td>";
echo "<form action=gosti.php method=post>";
echo "<td><input type=submit value=Оформить></td>";
echo "<input name=id type=hidden value=$id_number>";
echo "<input name=iklass type=hidden value=$id_klass>";
echo "<input name=imesta type=hidden value=$id_mesta>";
echo "<input name=nu type=hidden value=$number>";
echo "<input name=kl type=hidden value=$klass>";
echo "<input name=me type=hidden value=$mesta></form>";
echo "</tr>";
}
echo "</table>";
?>

3. выбераем понравившийся номер и далее появляется форма для внесения даты и времени:
<?php
include "conf.php";
$i = $_POST['id']; // id номера
$n = $_POST['nu'];
$ik = $_POST['iklass']; //id класса
$k = $_POST['kl'];
$im = $_POST['imesta']; //id мест
$m1 = $_POST['me'];
echo '<form action="gosti2.php" method=post>';
echo "номер комнаты: $n<br>";
echo "класс: $k<br>";
echo "место: $m1<br>";
echo 'Дата заселения: <input type="text" id="DATE_USTR" name=data1>
            <button id="DATE_USTRTrigger">...</button>
            <script type="text/javascript">
                Calendar.setup({
                    inputField : "DATE_USTR", // ID of the input field
                    ifFormat : "%Y.%m.%d", // the date format
                    button : "DATE_USTRTrigger" // ID of the button
                });    </script><br> '
;
echo "время заселения: <input type=text name=time1><br>";
echo 'Дата выселения: <input type="text" id="DATE_USTR1" name=data2>
            <button id="DATE_USTRTrigger1">...</button>
            <script type="text/javascript">
                Calendar.setup({
                    inputField : "DATE_USTR1", // ID of the input field
                    ifFormat : "%Y.%m.%d", // the date format
                    button : "DATE_USTRTrigger1" // ID of the button
                });    </script><br> '
;               
echo "время выселения: <input type=text name=time2><br>";
$data1 = $_POST['data1'];
$data2 = $_POST['data2'];
echo "<form action=gosti2.php method=post>";
echo '<INPUT TYPE=SUBMIT VALUE="Выбор"><br>';
echo "<input name=idd type=hidden value=$i>";
echo "<input name=nee type=hidden value=$n>";
echo "<input name=kee type=hidden value=$k>";
echo "<input name=ikee type=hidden value=$ik>";
echo "<input name=imee type=hidden value=$im>";
echo "<input name=mee type=hidden value=$m1></form>";
?>

4. теперь появляются анкеты, если 2-х местный номер то 2 анкеты соответственно:
<?php
include "conf.php";
$idn = $_POST['idd']; // id номера
$nuu = $_POST['nee'];
$ikl = $_POST['ikee']; //id класса
$kla = $_POST['kee'];
$imest = $_POST['imee']; //id мест
$mest = $_POST['mee'];
$data1 = $_POST['data1'];
$time1 = $_POST['time1'];
$data2 = $_POST['data2'];
$time2 = $_POST['time2'];
echo '<form action="gosti3.php" method=post>';
echo "номер комнаты: $nuu<br>";
echo "класс: $kla<br>";
echo "место: $mest<br>";
echo "дата заселения: $data1<br>";
echo "время заселения: $time1<br>";
echo "дата выселения: $data2<br>";
echo "время выселения: $time2<br>";
$mest;
for ($i=0; $i < $mest; $i++) {
echo "Фамилия: <input type=text name =family".$i."><br>";
echo "Имя: <input type=text name=name".$i."><br>";
echo "Отчество: <input type=text name=otch".$i."><br>";
echo "серия паспорта: <input type=text name=spas".$i."><br>";
echo "номер паспорта: <input type=text name=npas".$i."><br>";
echo "страна: <input type=text name=strana".$i."><br>";
echo "город: <input type=text name=gorod".$i."><br>";
echo "гражданство: <input type=text name=grajd".$i."><br>";  
echo ("<br>");
 }
echo '<INPUT TYPE=SUBMIT VALUE="Добавить"><br>';
print($i)
echo "<input name=iddn type=hidden value=$idn>";
echo "<input name=neen type=hidden value=$nuu>";
echo "<input name=ikasse type=hidden value=$ikl>";
echo "<input name=kle type=hidden value=$kla>";
echo "<input name=imeest type=hidden value=$imest>";
echo "<input name=mees type=hidden value=$mest>";
echo "<input name=iii type=hidden value=$i>";
echo "<input name=data1 type=hidden value=$data1>";
echo "<input name=time1 type=hidden value=$time1>";
echo "<input name=data2 type=hidden value=$data2>";
echo "<input name=time2 type=hidden value=$time2></form>";
?>

5. большая таблица со всеми внесенными данными:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<?php
include "conf.php";
$nu = $_POST['neen'];
$kl = $_POST['kle'];
$me = $_POST['mees'];
$fa11 = $_POST['family1'];
$fa12 = $_POST['family2'];
$fa13 = $_POST['family3'];
$na11 = $_POST['name1'];
$na12 = $_POST['name2'];
$na13 = $_POST['name3'];
$ot11 = $_POST['otch1'];
$ot12 = $_POST['otch2'];
$ot13 = $_POST['otch3'];
$sp11 = $_POST['spas1'];
$sp12 = $_POST['spas2'];
$sp13 = $_POST['spas3'];
$np11 = $_POST['npas1'];
$np12 = $_POST['npas2'];
$np13 = $_POST['npas3'];
$st11 = $_POST['strana1'];
$st12 = $_POST['strana2'];
$st13 = $_POST['strana3'];
$go11 = $_POST['gorod1'];
$go12 = $_POST['gorod2'];
$go13 = $_POST['gorod3'];
$gr11 = $_POST['grajd1'];
$gr12 = $_POST['grajd2'];
$gr13 = $_POST['grajd3'];
$a = $POST['iii'];
print_r($a);
print($family0);
print($family1);
print($family2);
if ($a=1) {
$w1 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa11.'","'.$na11.'","'.$ot11.'","'.$sp11.'",
"'
.$np11.'","'.$st11.'","'.$go11.'","'.$gr11.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w1) or die(mysql_error());}
if ($a=2) {
$w1 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa11.'","'.$na11.'","'.$ot11.'","'.$sp11.'",
"'
.$np11.'","'.$st11.'","'.$go11.'","'.$gr11.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w1) or die(mysql_error());
$w2 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa12.'","'.$na12.'","'.$ot12.'","'.$sp12.'",
"'
.$np12.'","'.$st12.'","'.$go12.'","'.$gr12.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w2) or die(mysql_error());}
else {
$w1 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa11.'","'.$na11.'","'.$ot11.'","'.$sp11.'",
"'
.$np11.'","'.$st11.'","'.$go11.'","'.$gr11.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w1) or die(mysql_error());
$w2 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa12.'","'.$na12.'","'.$ot12.'","'.$sp12.'",
"'
.$np12.'","'.$st12.'","'.$go12.'","'.$gr12.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w2) or die(mysql_error());
$w3 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, time_zas, data_v, time_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa13.'","'.$na13.'","'.$ot13.'","'.$sp13.'",
"'
.$np13.'","'.$st13.'","'.$go13.'","'.$gr13.'",
"'
.$_POST['data1'].'","'.$_POST['time1'].'","'.$_POST['data2'].'","'.$_POST['time2'].'")');
mysql_query($w3) or die(mysql_error());}
$s = 'select * from uchet';
$s = mysql_query($s) or die(mysql_error());
echo "<table border=1>";
echo "<tr><td>№комнаты</td><td>класс</td><td>кол-во мест</td><td>фамилия</td><td>имя</td><td>отчество</td>
<td>серия</td><td>номер паспорта</td><td>страна</td><td>город</td><td>гражданство</td>
<td>дата заселения</td><td>время</td><td>дата выселения</td><td>время</td><tr>"
;
while ($row = mysql_fetch_array($s))
{
    //$iddn = $row['id_number'];
    //$ikasse = $row['id_klass'];
    //$imeest = $row['id_mesta'];
    $family = $row['family'];
    $name = $row['name'];
    $otch = $row['otch'];
    $spas = $row['s_pas'];
    $npas = $row['n_pas'];
    $strana = $row['strana'];
    $gorod = $row['gorod'];
    $grajd = $row['grajdanstvo'];
    $data1 = $row['data_zas'];
    $time1 = $row['time_zas'];
    $data2 = $row['data_v'];
    $time2 = $row['time_v'];
echo "<tr><td>$nu</td><td>$kl</td><td>$me</td><td>$family</td><td>$name</td><td>$otch</td><td>$spas</td><td>$npas</td>
<td>$strana</td><td>$gorod</td><td>$grajd</td><td>$data1</td><td>$time1</td>
<td>$data2</td><td>$time2</td>"
;
}
echo "</table>";
echo '<form action="gosti.php" method=post>';
echo '<input type=submit value="Добавить ещё"> </form>';
?>

если взять 3-х местный номер и заполнить 3 анкеты, данные из первой анкеты он заменит данными из второй, из второй и третьей анкеты все заносит правильно. выбрав 2-х местный, щаполнив 2 анкеты, с первой записью происходит то же самое + идет добавление третьей пустой записи. в 1-местном номере, заполняя 1 анкету, идет добавление 3-х пустых полей. ужас просто, и как с этим всем разобраться?
23.03.2012, 12:04
Ответить

1234ru

Для такой задачи у Вас довольно неудобная структура таблиц.

Есть возможность переделать или нельзя трогать?
(как переделать - я скажу)
То, что не убивает нас, делает нас инвалидами.
24.03.2012, 03:11
Ответить
NO USERPIC

viderga

трогать очень нужно.. еще столько всего нужно сделать, а у меня самое элементарное не получается:з
24.03.2012, 11:42
Ответить
NO USERPIC

viderga

так как же мне исправить добавление, ведь почти все правильно:з
29.03.2012, 22:22
Ответить

1234ru

В общем, описанная задача должна быть решена следующим образом.

Делаем три таблицы:

1. Номера. Здесь хранятся только свойства номеров: количество мест, собственно номер и т.п.

2. Посетители - только свойства посетителей (имя и пр.)

3. Журнал заселения-выселения.
Именно в этой таблице будет информация о состоянии номеров.
Её же нужно будет использовать для запросов на предемет того, свободен ли номер в данный момент.

Структура таблиц такая (структуру таблиц правильно приводить в виде запросов на создание):

CREATE TABLE numbers (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255), -- собственно номер;
                        -- обычно номер - цифра,
                        -- но всякое бывает,
                        -- поэтому пусть будет строка
    bedspace TINYINT UNSIGNED NOT NULL, -- количество мест
    class ENUM('Нормальный', 'Люкс', 'Бомжатник') NOT NULL DEFAULT 'Нормальный'
    /* дальше могут быть какие-то еще поля,
       характеризующие номер,
       но они для рассмотрения не важны */

);

CREATE TABLE visitors (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    /* дальше можно всякие другие поля */
);

CREATE TABLE log ( -- журнал
    number_id INT UNSIGNED NOT NULL,
    visitor_id INT UNSIGNED NOT NULL,
    check_in TIMESTAMP NOT NULL DEFAULT 0, -- заселение
    check_out TIMESTAMP NOT NULL DEFAULT 0, -- выселение
    KEY(number_id)
);



Поступлю непоследовательно и сразу отвечу на вопрос "Как выбрать номера определенного класса, где есть места".

id номера и сколько занято в нем мест в данный момент, можно получить запросом:
SELECT
    number_id,
    COUNT(visitor_id)
FROM log
WHERE checkout > NOW()
GROUP BY number_id


Более детальную информацию о номерах лучше получать вот таким запросом:

SELECT
    numbers.id,
    numbers.title,
    numbers.class,
    numbers.bedspace, -- сколько всего мест в номере
    numbers.bedspace - IFNULL(current.occupied, 0) AS vacant -- сколько свободных
FROM numbers
LEFT JOIN (
        SELECT
            number_id,
            COUNT(visitor_id) AS occupied
        FROM log
        WHERE checkout > NOW()
        GROUP BY number_id
    ) AS current ON current.number_id = numbers.id
WHERE IFNULL(current.occupied, 0) = 0
      AND
      number.class = 'Бомжатник'



Я думаю, большинство из написанного непонятно.
Это нормально, просто потребуется больше времени. Обо всём, что непонятно - спрашивайте.
Здесь на самом деле мало что действительно сложного есть, просто много всего сразу.
Главное - продвигайтесь последовательно, и всё у вас получится.

Если от JOIN, GROUP BY, IFNULL или AS стало страшно - почитайте тут:

GROUP BY и IFNULL: http://webew.ru/posts/2823.webew#4181
AS: http://webew.ru/posts/2823.webew#4172
JOIN: http://webew.ru/posts/2823.webew#4176


Написал самое основное.
Начинать всегда нужно с того, чтобы выбрать правильные данные.
Когда с этим разберемся - можем перейти к формам и пр. - это куда более легкая задача.
То, что не убивает нас, делает нас инвалидами.
30.03.2012, 00:15
Ответить
NO USERPIC

viderga

чтоб узнать информацию о номерах у меня было вот так:
$s = ('SELECT *
 FROM number, mesta, klass
 WHERE klass.klass = "эконом" and number.id_mesta=mesta.id_mesta and number.id_klass=klass.id_klass'
);
$s = mysql_query($s) or die(mysql_error());
echo "<table border=\"1\" width=\"35%\" bgcolor=\"lavenderblush\">";
echo "<tr><td><B>номер комнаты</B></td><td><B>количество мест</B></td><td><B>foto</B></td>";
while ($myrow = mysql_fetch_array($s)){
$id_mesta=$myrow['id_mesta'];
$id_klass=$myrow['id_klass'];
$id_number=$myrow['id_number'];
$number=$myrow['number'];
$klass=$myrow['klass'];
$mesta=$myrow['mesta'];
echo "<tr>";
echo "<td>$number</td>";
echo "<td>$mesta</td>";
echo "<td><A HREF=javascript:l_image('foto/".$number.".jpg')>foto</a></td>";
echo "<form action=infa3.php method=post>";
echo "<td><input type=submit value=люди></td>";
echo "<input name=nu type=hidden value=$number>";
echo "<input name=kl type=hidden value=$klass>";
echo "<input name=me type=hidden value=$mesta></form>";

все работает, но решила сделать как вы написали:
$s = ('SELECT
     numbers.number_id,
     numbers.title,
     numbers.class,
     numbers.bedspace, -- сколько всего мест в номере
     numbers.bedspace - IFNULL(current.occupied, 0) AS vacant -- сколько свободных
FROM numbers n
LEFT JOIN (
         SELECT
             number_id,
             COUNT(visitor_id) AS occupied
         FROM log
         WHERE check_out > NOW()
     ) AS current ON current.number_id = numbers.number_id
WHERE IFNULL(current.occupied, 0) = 0
       AND
       numbers.class = "эконом"'
);
$s = mysql_query($s) or die(mysql_error());
echo "<table border=\"1\" width=\"35%\" bgcolor=\"lavenderblush\">";
echo "<tr><td><B>номер комнаты</B></td><td><B>количество мест</B></td><td><B>свободных</B></td>";
while ($myrow = mysql_fetch_array($s)){
$number_id=$myrow['number_id'];
$number=$myrow['number'];
$class=$myrow['class'];
$bedspace=$myrow['bedspace'];
</td>";

теперь не разберусь с ошибкой: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
вообще мне не нужно знать сколько осталось свободных мест в номере. дело в том, что 1 человек заселяется только в 1местный номер, но по его желанию (или если одноместных номеров нет), можно поместить и в 2хместный. когда несколько разных людей в один номер заселяют это хостел, я в счет беру только гостиницы. вообще главная цель у меня, это бронирование исходя из предоставляемых услуг в гостинице и в номерах..
30.03.2012, 16:38
Ответить

1234ru

У Вас таблицы остались прежними. Разумеется, запрос такой работать не будет.
Надо сначала привести таблицы к виду, который описан в моем предыдущем комментарии
(если там уже есть данные и лень заполнять заново руками - можно скриптом).
То, что не убивает нас, делает нас инвалидами.
30.03.2012, 17:12
Ответить
NO USERPIC

viderga

во втором случае я сделала все почти как у вас, только вместо id писала number_id, visitors_id.. создала новую базу для этого.. а первый пример из старой базы, показала как это выглядело у меня.
30.03.2012, 17:16
Ответить

1234ru

Я забыл написать GROUP BY :o (на это обратил внимание и vasya).

Вот такой запрос нужно:

'SELECT
     numbers.number_id,
     numbers.title,
     numbers.class,
     numbers.bedspace, -- сколько всего мест в номере
     numbers.bedspace - IFNULL(current.occupied, 0) AS vacant -- сколько свободных
FROM numbers
LEFT JOIN (
         SELECT
             number_id,
             COUNT(visitor_id) AS occupied
         FROM log
         WHERE check_out > NOW()
         GROUP BY number_id
     ) AS current ON current.number_id = numbers.number_id
WHERE IFNULL(current.occupied, 0) = 0
       AND
       numbers.class = "эконом"'


(в предыдущем комментарии тоже про GROUP BY исправил)
То, что не убивает нас, делает нас инвалидами.
30.03.2012, 18:22
Ответить
NO USERPIC

viderga

блин, пишет #1054 - Unknown column 'numbers.number_id' in 'field list'
numbers или title или class.. в бд и запросе записи одинаковые
30.03.2012, 18:46
Ответить
NO USERPIC

vasya

Если вы пишите "FROM numbers n", то вместо "numbers.number_id" нужно писать "n.number_id"
30.03.2012, 19:15
Ответить

1234ru

Снова vasya прав.
Это, опять же, моя ошибка: забыл убрать псевдоним у таблицы numbers.

viderga, напишите FROM numbers вместо FROM numbers n.

(основное сообщение также исправил, чтоб путаницы не было).
То, что не убивает нас, делает нас инвалидами.
30.03.2012, 19:27
Ответить
NO USERPIC

viderga

угу, пока несовсем понятно, разбираюсь.. запрос работает)
30.03.2012, 19:39
Ответить

1234ru

Сделайте SELECT * FROM numbers и посмотрите. как в действительности у вас колонки называются.
То, что не убивает нас, делает нас инвалидами.
30.03.2012, 19:15
Ответить
NO USERPIC

viderga

когда количество мест было в отдельной таблицы, такой проблемки небыло, теперь я не знаю как селать чтобы он выдавал только 1,2,3 а не 1,1,1,1,1,2,2,2,2,2,3,3,3,3,3.. пишу так:
$s = mysql_query($s) or die(mysql_error());
echo "Количество мест: ";
echo "<select class=input type=text name='bedspace'>";
    while ($rows = mysql_fetch_array($s)) {
        $bedspace = $rows['bedspace'];
        $number_id = $rows['number_id'];

        echo "<option value=$bedspace>";
        echo $bedspace;
    }
echo "</select><br>";

лучше было бы конечно радиокнопками, но подобное я пробовала использовать уже в бронировании и зашла в тупик
30.03.2012, 20:56
Ответить

1234ru

Попробуйте
SELECT DISTINCT bedspace
FROM numbers


(DISTINCT предписывает взять только уникальные, не повторяющиеся строки из выборки)
То, что не убивает нас, делает нас инвалидами.
30.03.2012, 21:12
Ответить

1234ru

Радиокнопками почему бы нет?

<label>
    <input name="bedspace" type="radio" value="1">
    одноместные
</label>

<label>
    <input name="bedspace" type="radio"  value="2">
    двухместные
</label>

<label>
    <input name="bedspace" type="radio"  value="3">
    трёхместные
</label>
То, что не убивает нас, делает нас инвалидами.
30.03.2012, 21:14
Ответить
NO USERPIC

viderga

если делать радиокнопки, то допустим я в следующей форме приму их как
$q1 = $_POST['1'];
$q2 = $_POST['2'];
$q3 = $_POST['3'];

но далее,как мне их описать в запросе, чтоб было понятно что q1 и есть та запись "1" или "эконом" в бд?
30.03.2012, 21:25
Ответить

1234ru

А можете так и писать - <input value="Эконом"...>, а потом так и вставлять в базу.
То, что не убивает нас, делает нас инвалидами.
30.03.2012, 22:56
Ответить
NO USERPIC

viderga

регистрация теперь выглядит вот так..
это чтобы n мест = n анкет:
$bedspace;
for ($i=0; $i < $bedspace; $i++) {
echo "Фамилия: <input type=text name =family".$i."><br>";
echo "Имя: <input type=text name=name".$i."><br>";
echo "Отчество: <input type=text name=otch".$i."><br>";

echo ("<br>");
 }
echo '<INPUT TYPE=SUBMIT VALUE="Добавить"><br>';

а теперь непонятно, как всетаки написать, чтоб добавлял 2 записи, если заполнено 2; 1 запись, если заполнена 1..
я описывала примерно так:
$title = $_POST['title'];
$class = $_POST['class'];
$bedspace = $_POST['bedspace'];
$fa11 = $_POST['family1'];
$fa12 = $_POST['family2'];
$fa13 = $_POST['family3'];
$na11 = $_POST['name1'];
$na12 = $_POST['name2'];
$na13 = $_POST['name3'];
$ot11 = $_POST['otch1'];
$ot12 = $_POST['otch2'];
$ot13 = $_POST['otch3'];

$w = ('insert into log (number_id, check_in, check_out)
values ("'
.$_POST['number_id'].'","'.$_POST['check_in'].'","'.$_POST['check_out'].'")');
mysql_query($w) or die(mysql_error());
$w1 = ('insert into visitors ( family, name, otch)
values ("'
.$fa11.'","'.$na11.'","'.$ot11.'")');
но получалось слишком громоздко и к тому же неправильно работает..
спасибо за обучение, вы отлично объясняете, с вами узнаю много всего нужного)
30.03.2012, 22:20
Ответить

1234ru

Организовать группы в форме можно вот как.

Мало кто знает, что вообще-то массив $_POST необязательно должен быть одномерным.
Другими словами, если сделать поля, к примеру

<input name="[0][family]"...>
<input name="[0][otch]"...>
<input name="[0][...]"...>
...


, то $_POST[0] будет содержать характеристики для записи № 0, и т.п.
Вместо 0 можно использовать любое число (да и не обязательно число, можно и строку, если надо).

При проверке формы нужно просто пройтись по $_POST циклом, а так отличий никаких.


Вы быстро схватываете, легко объяснять :)
То, что не убивает нас, делает нас инвалидами.
30.03.2012, 23:11
Ответить
NO USERPIC

viderga

а что сделать с этим:
$w = ('insert into log (number_id, visitor_id, check_in, check_out)
values ("'
.$_POST['number_id'].'","'.$_POST['visitor_id'].'","'.$_POST['check_in'].'","'.$_POST['check_out'].'")');
mysql_query($w) or die(mysql_error());
$w1 = ('insert into visitors ( family, name, otch)
values ("'
.$_POST['family1'].'","'.$na11.'","'.$ot11.'")');
mysql_query($w1) or die(mysql_error());

а то ошибка через раз: Duplicate entry '1' for key 1,
а вот так:
$w1 = ('insert into log, visitors (id_number, class, bedspase, family, name, otch,
check_in, check_out)
values ("'
.$_POST['number_id'].'","'.$_POST['class'].'","'.$_POST['bedspase'].'","'.$fa11.'","'.$na11.'","'.$ot11.'",
"'
.$_POST['check_in'].'","'.$_POST['check_out'].'")');
mysql_query($w1) or die(mysql_error());
}

не хочет данные добавлять ни в таблицу visitors, ни в log, ругается:' visitors (id_number, class, bedspase, family, name, otch, check_in, check_out' at line 1.. вроде как он не может эти поля добавить в таблицу visitors,т.к. там таких нет.. не пойму, запуталась
просто всегда работала с одной таблицей,а тут 2.. у меня работает подобное добавление, но в одну таблицу:
$i = $_POST['ii'];
$i= $i - 1;
for ($k=1; $k <= $i; $k++) {
$fa11 = $_POST['family'.$k.''];
$na11 = $_POST['name'.$k.''];
$ot11 = $_POST['otch'.$k.''];
$sp11 = $_POST['spas'.$k.''];
$np11 = $_POST['npas'.$k.''];
$st11 = $_POST['strana'.$k.''];
$go11 = $_POST['gorod'.$k.''];
$gr11 = $_POST['grajd'.$k.''];

$w1 = ('insert into uchet (id_number, id_klass, id_mesta, family, name, otch, s_pas, n_pas, strana, gorod, grajdanstvo,
data_zas, data_v)
values ("'
.$_POST['iddn'].'","'.$_POST['ikasse'].'","'.$_POST['imeest'].'","'.$fa11.'","'.$na11.'","'.$ot11.'","'.$sp11.'",
"'
.$np11.'","'.$st11.'","'.$go11.'","'.$gr11.'",
"'
.$_POST['data1'].'","'.$_POST['data2'].'")');
mysql_query($w1) or die(mysql_error());
}
31.03.2012, 14:03
Ответить

1234ru

Цитата:
просто всегда работала с одной таблицей,а тут 2..


Ну да. Причем надо сначала вставлять в visitors, чтобы получить visitor_id, и только потом - в log.
Одновременно это сделать нельзя, т.к. неизвестно, какой id посетителя.

Вообще говоря, посетителей надо уметь как-то идентифицировать.
Например, если один и тот же человек заселялся несколько раз, надо уметь ему как-то дать возможность, грубо говоря, залогиниться (например, указав email и пароль).
Если человек таким образом себя идентифицирует, то visitor_id будет известен.

Если же человек новый, то его сначала нужно занести в таблицу:

$sql = "
    INSERT INTO visitors
    SET
        family = '"
. mysql_real_escape_string($_POST['family']) . "',
        name = '"
. mysql_real_escape_string($_POST['name']) . "',
        otch = '"
. mysql_real_escape_string($_POST['otch']) . "'
    "
;
mysql_q($sql); // выполняем запрос
$visitor_id = mysql_insert_id(); // получаем id нового посетителя


mysql_q(). mysql_real_escape_string().
mysql_insert_id().


Теперь, имея id посетителя, можно записывать информацию в log (функции mysql_real_escape_string() и intval() применяются при составлении запросов чтобы исключить влияние специальных для mysql символов (например, одинарных кавычек), которые могут попасться во вводимых пользователем данных):

$sql = "
    INSERT INTO log
    SET
        number_id = "
. intval($_POST['number_id']) . ",
        visitor_id = $visitor_id, -- тут intval не надо,
                                  -- т.к. эту переменную делали сами
                                  -- и в том, что там никаких кавычек не будет,
                                  -- уверены на 100%
        check_in = '"
. mysql_real_escape_string($_POST['check_in']) . "',
        check_out = '"
. mysql_real_escape_stroutg($_POST['check_out']) . "'
    "
;
mysql_q($sql);
То, что не убивает нас, делает нас инвалидами.
01.04.2012, 22:01
Ответить
NO USERPIC

viderga

добавление в 2 таблицы получилось, спасибо большущее:)
а как бы сделать такой запрос правильным? с помощью чего?
$zapros1 = ('SELECT *
  FROM number, mesta, klass, uslugi, uslugi2
  WHERE number.id_mesta=mesta.id_mesta and number.id_klass=klass.id_klass and
  uslugi.id_usl=uslugi2.id_usl and uslugi2.id_number=number.id_number and
  number.id_mesta="'
.$w.'" and (uslugi.id_usl="'.$q1.'" and uslugi.id_usl="'.$q2.'" or uslugi.id_usl="'.$q3.'" and uslugi.id_usl="'.$q4.'") or uslugi.id_usl="'.$q5.'"
 and uslugi.id_usl="'
.$q6.'" or uslugi.id_usl="'.$q7.'" and uslugi.id_usl="'.$q8.'" or uslugi.id_usl="'.$q9.'" and uslugi.id_usl="'.$q10.'" or uslugi.id_usl="'.$q11.'"
 and uslugi.id_usl="'
.$q12.'" or uslugi.id_usl="'.$q13.'" and uslugi.id_usl="'.$q14.'" or uslugi.id_usl="'.$q15.'" and uslugi.id_usl="'.$q16.'" or uslugi.id_usl="'.$q17.'"
 and uslugi.id_usl="'
.$q18.'" or uslugi.id_usl="'.$q19.'"');
02.04.2012, 19:28
Ответить
NO USERPIC

viderga

я чего-то недописываю наверное.. когда в форме меняю select на радиокнопки:
вообщем вот вся форма:
echo "<form action=sos.php method=post>";
echo "<label>";
echo "<input type='radio' name='klass'  value='эконом'  checked='checked'>";
echo 'эконом';
echo "</label>";
echo "<label>";
echo "<input type='radio' name='klass'  value='стандарт'>";
echo 'стандарт';
echo "</label>";
echo "<label>";
echo "<input type='radio' name='klass'  value='полулюкс'>";
echo 'полулюкс';
echo "</label>";
echo "<label>";
echo "<input type='radio' name='klass'  value='люкс'>";
echo 'люкс';
echo "</label></form>";
$s = "select DISTINCT bedspace from numbers";
$s = mysql_query($s) or die(mysql_error());
echo "Количество мест: ";
echo "<select bedspace=input type=text name='bedspace'>";
    while ($rows = mysql_fetch_array($s)) {
        $bedspace = $rows['bedspace'];
        $number_id = $rows['number_id'];
        echo "<option value=$bedspace>";
        echo $bedspace;
    }
echo "</select><br>";
echo "<td><input type=submit value=Оформить></form>";
?>

спецом один оставила без изменений, другой поменяла.. просто ничего не происходит при нажатии на кнопку, не переходит в следущую форму.. чего я недописываю?
31.03.2012, 17:00
Ответить

1234ru

А что значит "не переходит в следующую форму"?
То, что не убивает нас, делает нас инвалидами.
01.04.2012, 22:02
Ответить
NO USERPIC

viderga

т.е. он не ищет номера которые соответствуют выбранному классу и количеству мест. следующая форма должна показать их в таблице, где можно выбрать любой появившийся номер, и продолжить регистрацию в этот номер..
вот она:
<?php
include "conf.php";
$class = $_POST['class'];
$bedspace = $_POST['bedspace'];
print($class);
print($bedspace);
 $querys = ('SELECT *
 FROM numbers
 WHERE numbers.bedspace="'
.$bedspace.'" AND numbers.class="'.$class.'"
 AND numbers.title NOT IN ( SELECT title FROM log
 WHERE NOW() BETWEEN check_in AND check_out)'
);
$querys = mysql_query($querys) or die(mysql_error());
echo "<table border=\"1\" width=\"70%\" bgcolor=\"lavenderblush\">";
echo "<tr><td><B>номер комнаты</B></td><td><B>класс</B></td><td><B>количество мест</B></td>";
while ($myrow = mysql_fetch_array($querys)){
$number_id=$myrow['number_id'];
$title=$myrow['title'];
$class=$myrow['class'];
$bedspace=$myrow['bedspace'];
echo "<tr>";
echo "<td>$title</td>";
echo "<td>$class</td>";
echo "<td>$bedspace</td>";
echo "<form action=gosti.php method=post>";
echo "<td><input type=submit value=Оформить></td>";
echo "<input name=number_id type=hidden value=$number_id>";
echo "<input name=title type=hidden value=$title>";
echo "<input name=class type=hidden value=$class>";
echo "<input name=bedspace type=hidden value=$bedspace></form>";
echo "</tr>";
}
echo "</table>";
?>
02.04.2012, 10:38
Ответить

1234ru

1. У вас тег <form> закрывается два раза. Первый раз - тут:
echo 'люкс';
echo "</label></form>";

Отсюда уберите.

2. Тег <option> должен иметь вид
"<option bedspace=\"$bedspace\">$bedspace</option>"


Также совершенно непонятно назначение текста bedspace=input. Уберите его.
То, что не убивает нас, делает нас инвалидами.
04.04.2012, 22:33
Ответить
NO USERPIC

viderga

а как бы сделать такой запрос правильным? с помощью чего?
$zapros1 = ('SELECT *
FROM number, mesta, klass, uslugi, uslugi2
WHERE number.id_mesta=mesta.id_mesta and number.id_klass=klass.id_klass and
uslugi.id_usl=uslugi2.id_usl and uslugi2.id_number=number.id_number and
number.id_mesta="'.$w.'" and (uslugi.id_usl="'.$q1.'" and uslugi.id_usl="'.$q2.'" or uslugi.id_usl="'.$q3.'" and uslugi.id_usl="'.$q4.'") or uslugi.id_usl="'.$q5.'"
and uslugi.id_usl="'.$q6.'" or uslugi.id_usl="'.$q7.'" and uslugi.id_usl="'.$q8.'" or uslugi.id_usl="'.$q9.'" and uslugi.id_usl="'.$q10.'" or uslugi.id_usl="'.$q11.'"
and uslugi.id_usl="'.$q12.'" or uslugi.id_usl="'.$q13.'" and uslugi.id_usl="'.$q14.'" or uslugi.id_usl="'.$q15.'" and uslugi.id_usl="'.$q16.'" or uslugi.id_usl="'.$q17.'"
and uslugi.id_usl="'.$q18.'" or uslugi.id_usl="'.$q19.'"');
05.04.2012, 22:12
Ответить

1234ru

Часть, которая касается условий на uslugi.id_usl, содержит совершенно адовую смесь AND и OR, понять смысл которой у меня не получилось.
Однако вам должно помочь следующее:

id_usl = $q1 OR id_usl = $q2 OR id_url = $q3

можно заменять оператором IN:

id_usl IN ($q1, $q2, $q3).
То, что не убивает нас, делает нас инвалидами.
07.04.2012, 02:20
Ответить
NO USERPIC

viderga

Здравствуйте.. у меня теперь проблемы с таким запросом. он работает но неправильно.
сначала выбираются нужные услуги:
echo "<form action=bron12.php method=post>";
echo "<b> Выберите услуги: </b><br>";
echo "<input type='checkbox' name='usl1' value='1'> компьютер с интернетом<br>";
echo "<input type='checkbox' name='usl2' value='2'>холодильник<br>";
echo "<input type='checkbox' name='usl3' value='3'>джакузи<br>";

потом нажимаем кнопочку и система ищет номера в которых есть выбранные услуги:
$querys1 = ('SELECT *
 FROM numbers, uslugi, uslugi2
 WHERE numbers.bedspace="'
.$bedspace.'" AND numbers.number_id=uslugi2.number_id
 AND uslugi2.usl_id=uslugi.usl_id
 AND uslugi.usl_id IN ("'
.$q1.'", "'.$q2.'", "'.$q3.'", "'.$q4.'", "'.$q5.'", "'.$q6.'", ... , "'.$q19.'")
 AND numbers.title NOT IN ( SELECT number_id FROM log
 WHERE NOW() BETWEEN check_in AND check_out )'
);
$querys1 = mysql_query($querys1) or die(mysql_error());
var_dump ($querys1);  
$k= mysql_num_rows($querys1 );
$i=1;
while ($i <= $k){
while ($myrow = mysql_fetch_array($querys1)){
echo "<table border=\"1\" width=\"30%\" bgcolor=\"lavenderblush\">";
echo "<tr><td><B>№_комнаты</B></td><td><B>класс</B></td><td><B>кол-во мест</B></td>";
echo "<tr>";
$id_number = $myrow['id_number'];
$title = $myrow['title'];
$number = $myrow['number'];
$class = $myrow['class'];
$bedspace = $myrow['bedspace'];
echo "<td>$title</td>";
echo "<td>$class</td>";
echo "<td>$bedspace</td>";
echo "</tr>";
echo "</table>";
echo "<input name=title type=hidden value=$title>";
echo "<input name=class type=hidden value=$class>";
echo "<input name=bedspace type=hidden value=$bedspace>";
echo "</form>";

хотелось бы чтоб он выдавал только номера с выбранными услугами, без лишних..
добавила таблицы:
имя - uslugi, поля: usl_id (ключевое поле, auto increment), usluga(varchar);
uslugi2, поля usl_id(int), number_id(int).
и еще интересно, можно ли сделать так что если я не выбираю ни одной услуги, то он бы выдавал и номера без услуг, т.е. их нету в таблице uslugi2, или выдавал номера с одной, двумя услугами.. и как это вообще сделать?
08.04.2012, 20:28
Ответить

1234ru

Как-то так, я думаю:

1. Сначала выбираем id номеров:
$sql = "
    SELECT DISTINCT n.number_id
    FROM numbers n
    JOIN uslugi2 u2 ON n.number_id = u2.number_id
    WHERE uslugi.usl_id IN ($q1, $q2, ...)
      AND numbers.title ...
      AND NOW() BETWEEN ...
    "
;
   
$ids = mysql_getcolumn($sql);


Т.к. uslugi.usl_id - это число, кавычки вокруг аргументов не нужны.

DISTINCT нужен, чтобы один и тот же номер не был упомянут несколько раз в том случае, если для него совпало больше одной услуги - без DISTINCT количество строк в результате будет определяться таковым в таблице соответствия услуг номерам, поэтому без DISTINCT один номер может встретиться несколько раз.

Кстати, точно number.title NOT IN, а не numbers.number_id NOT IN?

Если нужны номера без услуг, то строгий JOIN нужно заменить на LEFT JOIN:

$sql = "
    FROM numbers n
    LEFT JOIN uslugi2 u2 ON n.number_id = u2.number_id
    WHERE (
                uslugi.usl_id IN ($q1, $q2, ...)
            OR uslugi.usl_id IS NULL
        )
      AND numbers.title ...
      AND NOW() BETWEEN ...
    "
;


2. Выбираем нужную информацию о номерах по id:
$sql = "
    SELECT *
    FROM numbers
    WHERE number_id IN ("
. implode(",", $ids) . ")
    "
;
   
$rawdata = mysql_gettable($sql);
$sorted_data = array();
foreach ($ids as $id) {
    // восстанавливаем порядок записей
    // (нужно в случае, если нужна
    //  конкретная сортировка номеров)
    $sorted_data[$id] = $rawdata;
}


mysql_getcolumn(), mysql_gettable()
То, что не убивает нас, делает нас инвалидами.
09.04.2012, 22:19
Ответить
NO USERPIC

vasya

id номера и сколько занято в нем мест в данный момент, можно получить запросом:

SELECT
    number_id,
    COUNT(visitor_id)
FROM log
WHERE checkout > NOW() GROUP BY number_id
30.03.2012, 17:03
Ответить
NO USERPIC

viderga

от чего-то ругается на mysql_getcolumn() и mysql_gettable():
Fatal error: Call to undefined function mysql_getcolumn()
если убрать все и оставить выбор id номеров возникает куча ошибок, которых никогда еще не видела, чаще всего такая:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' , , , , , , , , , , , , , , , , , ) OR uslugi.usl_id IS NULL)' at line 4
при выборе первых трех услуг между запятыми соответственно возникают первые три цифры, дальше же пойдут только тройки..
в отчаянии довела до такого вида:
$querys1 = " SELECT DISTINCT numbers.number_id, uslugi.usl_id
     FROM numbers, uslugi
     LEFT JOIN uslugi2 ON numbers.number_id = uslugi2.number_id
     WHERE (uslugi.usl_id IN ($q1, $q2, $q3)
             OR uslugi.usl_id IS NULL)
where numbers.number_id NOT IN ( SELECT number_id FROM log
 WHERE NOW() BETWEEN check_in AND check_out )"
;
 $querys1 = mysql_query($querys1) or die(mysql_error());

возникает ошибка:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 2, ) OR uslugi.usl_id IS NULL) where numbers.number_id NOT IN ( ' at line 4
двойка - это выбранная услуга - вторая, при выборе третьей так же, если выбрать все 3 то ошибка меняется:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where numbers.number_id NOT IN ( SELECT number_id FROM log WHERE NOW() BETWEE' at line 6
капец, любое изменение приводит к новой ошибке-_-
10.04.2012, 12:56
Ответить
NO USERPIC

vasya

Последняя ошибка - у вас в запросе два раза упоминается where, второе линие.
Предпоследняя ошибка - лишняя запятая после 2
10.04.2012, 14:38
Ответить
NO USERPIC

viderga

да это ничего не меняет.. вот:
$querys1 = " SELECT DISTINCT numbers.number_id, uslugi.usl_id
      FROM numbers, uslugi
      LEFT JOIN uslugi2 ON numbers.number_id = uslugi2.number_id
      WHERE (uslugi.usl_id IN ($q1 $q2 $q3)
              OR uslugi.usl_id IS NULL)
 AND numbers.number_id NOT IN ( SELECT number_id FROM log
  WHERE NOW() BETWEEN check_in AND check_out )"
;
  $querys1 = mysql_query($querys1) or die(mysql_error());

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 ) OR uslugi.usl_id IS NULL) AND numbers.number_id NOT IN ( SE' at line 4
10.04.2012, 15:29
Ответить

1234ru

А вы сделайте echo $querys1 и посмотрите, что за запрос получается.
То, что не убивает нас, делает нас инвалидами.
10.04.2012, 15:51
Ответить
NO USERPIC

viderga

вот так.?
SELECT DISTINCT numbers.number_id, uslugi.usl_id FROM numbers, uslugi LEFT JOIN uslugi2 ON numbers.number_id = uslugi2.number_id WHERE (uslugi.usl_id IN ( 2 ) OR uslugi.usl_id IS NULL) AND numbers.number_id NOT IN ( SELECT number_id FROM log WHERE NOW() BETWEEN check_in AND check_out )Unknown column 'numbers.number_id' in 'on clause'
10.04.2012, 15:58
Ответить

1234ru

Так, я несколько запутался в названиях колонок у вас..
Попробуйте numbers.number_id заменить на numbers.id
Если не получится - посмотрите, как у вас называется колонка с id в таблице numbers, и поставьте ее название в запрос.
То, что не убивает нас, делает нас инвалидами.
11.04.2012, 00:41
Ответить
NO USERPIC

viderga

в таблице numbers колонка с id называется number_id.. умнея есть множество других запросов связанных с numbers.number_id и все работает отлично
11.04.2012, 09:57
Ответить

1234ru

Тогда все это очень странно.

Сам запрос вам надо переделать, но пока давайте разберемся с колонкой.

Упростим запрос, оставив только таблицу numbers.

Попробуйте такой:

SELECT DISTINCT numbers.number_id
FROM numbers
WHERE numbers.number_id NOT IN (
            SELECT number_id
            FROM log
            WHERE NOW() BETWEEN check_in AND check_out
        )
То, что не убивает нас, делает нас инвалидами.
11.04.2012, 13:45
Ответить
NO USERPIC

viderga

если так, то ошибок нет, ничего не выдает.. print(rueris1) выдает - Resource id #4
11.04.2012, 17:07
Ответить

1234ru

Вам надо его разобрать с помощью mysql_fetch_assoc.
Если хотите быстрее и удобнее - используйте mysql_gettable($querys1) отсюда.
То, что не убивает нас, делает нас инвалидами.
11.04.2012, 21:49
Ответить

1234ru

Так, ну и раз нет ошибок, попробуем следующий шаг:
SELECT DISTINCT numbers.number_id
FROM numbers
LEFT JOIN uslugi ON numbers.number_id = uslugi.number_id
WHERE (
        uslugi.usl_id IN (2)
        OR uslugi.usl_id IS NULL
    )
    AND
    numbers.number_id NOT IN (
            SELECT number_id
            FROM log
            WHERE NOW() BETWEEN check_in AND check_out
        )


Тоже ошибок быть не должно.
То, что не убивает нас, делает нас инвалидами.
11.04.2012, 21:52
Ответить
NO USERPIC

viderga

здравствуйте! оставим пока это... с датой завал получился, не работает ничего правильно(
в запросе
$querys = ('SELECT *
 FROM numbers
 WHERE numbers.bedspace="'
.$bedspace.'" AND numbers.class="'.$class.'"
 AND numbers.number_id NOT IN ( SELECT number_id FROM log
 WHERE NOW() BETWEEN check_in AND check_out )

не работает выборка по датам.. т.е. он вообще не блокирует номера которые заняты..
а этот запрос:
$querys = ('SELECT
numbers.number_id,
     numbers.cena,
     numbers.title,
     numbers.class,
     numbers.bedspace, -- сколько всего мест в номере
     numbers.bedspace - IFNULL(current.occupied, 0) AS vacant -- сколько свободных
FROM numbers
LEFT JOIN (
         SELECT
             number_id,
             COUNT(visitor_id) AS occupied
         FROM log
         WHERE check_out > NOW()
         GROUP BY number_id
     ) AS current ON current.number_id = numbers.number_id
WHERE IFNULL(current.occupied, 0) = 0
       AND
       numbers.bedspace="'
.$bedspace.'" AND numbers.class="'.$class.'"
     '
);

просто не выдает номера, которые вообще с любой датой стоят в таблице log
так возможно ли сделать так чтоб номер, занятый в период с 5 по 6 число был доступен с 7 по 8?
в начале я ведь выбираю check_in и check_out, чтоб посмотреть номера свободные именно в этот период..
13.04.2012, 06:05
Ответить

1234ru

Цитата:
он вообще не блокирует номера которые заняты..

Проверьте, что выдает подзапрос:

SELECT number_id
FROM log
WHERE NOW() BETWEEN check_in AND check_out

Он должен выдавать номера, которые заняты.

Цитата:
так возможно ли сделать так чтоб номер, занятый в период с 5 по 6 число был доступен с 7 по 8?


Тогда в запросе нужно отталкиваться не от NOW(), а от той даты, на которую выясняется наличие свободных номеров.

В MySQL есть много функций для работы с датами: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
Подумайте, что как алгоритмически вы хотите получить дату, и выберите из функций такую, которая вам подходит (наверняка там такая есть).
То, что не убивает нас, делает нас инвалидами.
13.04.2012, 23:21
Ответить
NO USERPIC

viderga

а что делать если при передаче в следующую форму даты в формате "yyyy-MM-dd HH:mm" он принимает ее в формате "yyyy-MM-dd", часы и минуты теряются..
выбираю дату и время:
echo ' Прибытие: <input type="text" id="DATE_USTR1" name="check_in" class="datetimepicker_ru" />
    <Control.DatePicker.Locale["ru_RU"] = {
    dateTimeFormat: "yyyy-MM-dd HH:mm",
    dateFormat: "yyyy-MM-dd",
    use24hrs: false,
    firstWeekDay: 1,
    weekend: [0,6],
    language: "ru"
    };> </script><br> '
;

потом в следующей форме получаю 2 даты и считаю количество дней (дата принимается в виде "yyyy-MM-dd HH:mm"):
$class = $_POST['class'];
$bedspace = $_POST['bedspace'];
$check_in = $_POST['check_in'];
$check_out = $_POST['check_out'];
$day = '86400';
$d1 = strtotime($check_in);
$d2 = strtotime($check_out);
$timee1 = ($d2 - $d1)/$day;
$timee = round ($timee1);
echo "<b>дата заселения:</b> $check_in<br>";
echo "<b>дата выселения:</b> $check_out<br>";
echo "<b>количество дней:</b> $timee<br>";
echo "<input name=check_in type=hidden value=$check_in>";
echo "<input name=check_out type=hidden value=$check_out>";

- передаю в следующую форму для дальнейшего внесения в бд, и вот тут то он принимает только дату в формате "yyyy-MM-dd", почему часы то откидывает??:
$sql = "
     INSERT INTO log
     SET
         number_id = '"
. mysql_real_escape_string($_POST['number_id']) . "',
         visitor_id = $visitor_id,
         check_in = '"
. mysql_real_escape_string($_POST['check_in']) . "',
         check_out = '"
. mysql_real_escape_string($_POST['check_out']) . "'
     "
;
 mysql_query($sql);
14.04.2012, 13:19
Ответить

1234ru

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

Может, вам часы и минуты не нужны? Номера-то снимаются посуточно.

Если все-таки нужны, подумайте, откуда их брать будете - пользователей заставлять вводить или автоматически как-то генерировать.
То, что не убивает нас, делает нас инвалидами.
16.04.2012, 03:52
Ответить
NO USERPIC

viderga

решила разделить дату и время отдельно, чтоб легче было заносить данные по отдельности и в разное время..
как сделать, чтоб время и дата регистрации заносились в бд автоматически.. т.е. я выбираю только дату выселенияи нажимаю ОК, при этом вносится в бд сегодняшнее число в check_in то, что я указала число в check_out и время заселения (time_in) занеслось автоматически тоже.. а time_out время выселения, можно было бы указать позже..
наверно неправильно формулирую вопрос, но в интернете ничего не могу найти что могло бы помочь:з
19.04.2012, 12:39
Ответить

1234ru

Цитата:
как сделать, чтоб время и дата регистрации заносились в бд автоматически..


Чтобы время и дата заносились в две разных колонки - нельзя (вернее, если честно, можно - с помощью триггеров, но вам это пока еще лучше не надо).

А вот время и дату в одну колонку - можно.
Есть тип данных TIMESTAMP. Если сделать вот так:

CREATE TABLE ... (
...
check_in TIMESTAMP DEFAULT CURRENT_TIMESTAMP()
...
)


, то у каждой новой записи колонка check_in будет автоматически получать (на момент добавления записи) текущие время и дату, специально выставлять в запросе колонке значение не надо.

(такое можно сделать только с одной колонкой в таблице)

Цитата:
я выбираю только дату выселенияи нажимаю ОК, при этом вносится в бд сегодняшнее число в check_in то, что я указала число в check_out и время заселения (time_in) занеслось автоматически тоже..

Вы уверены, что вам всегда нужно именно сегодняшнее число? Другими словами, разве вселяются всегда в момент заполнения формы?

Вообще я бы на вашем месте имел две временных метки - время подачи заявки и собственно время житья в гостинице (т.е. check_in|check_out).
То, что не убивает нас, делает нас инвалидами.
20.04.2012, 02:34
Ответить
NO USERPIC

viderga

я сделала немного иначе
$check_in= date("d.m.Y");
$time_in = date("H:i:s");
а потом занесла это данные в бд..
в случае бронирования мне конечно нужно выбирать дату заселения.. но обычная регистрация не должна занимать время еще и не внесения сегодняшнего числа + времени..

20.04.2012, 12:48
Ответить
NO USERPIC

viderga

кажется вся проблема из за Join.. а может быть, что у меня версия php не вывозит? запускаю test.php пишит - PHP Version 5.2.6
а на домашней страничке MySQL пишет phpMyAdmin - 2.10.3, Версия MySQL-клиента: 5.0.51a
10.04.2012, 17:25
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100