За последние 24 часа нас посетил 16971 программист и 1694 робота. Сейчас ищут 963 программиста ...

Ошибка в запросе к MySQL

Тема в разделе "PHP для новичков", создана пользователем veteran, 29 мар 2012.

  1. veteran

    veteran Активный пользователь

    С нами с:
    2 мар 2012
    Сообщения:
    15
    Симпатии:
    0
    Здравствуйте, уважаемые форумчане. После запроса к mysql, выводятся данные не так, как надо;помогите, пожалуйста, исправить ошибку.

    Есть массив с данными
    foreach($forms as $keyss => $val)

    {
    while(list($ku,$mmk)=each ($val))
    {

    после обработки которого пишу

    $keyss="and $ku='$mmk' ";

    что означает

    $pm1="and этаж=2";
    $pm2="and район=Centralnii";


    после чего формируется запрос к базе


    $result = mysql_query("SELECT район,комнаты,этаж FROM form_danniye where id >0 ".$keyss." ",$db);

    В итоге, данные выводятся не по двум условиям, а по каждому из условий по отдельности(то есть, по первому and и по второму and и выводятся вместе)

    Помогите исправить ошибку.
     
  2. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    $keyss="and $ku='$mmk' ";
     
  3. veteran

    veteran Активный пользователь

    С нами с:
    2 мар 2012
    Сообщения:
    15
    Симпатии:
    0
    а, что тут надо поменять?
     
  4. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    Надо поставить конкатенацию
    $keyss .="and $ku='$mmk' ";
     
  5. veteran

    veteran Активный пользователь

    С нами с:
    2 мар 2012
    Сообщения:
    15
    Симпатии:
    0
    тогда вообще ничего не выводится
     
  6. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    А нельзя ли полный код?
     
  7. veteran

    veteran Активный пользователь

    С нами с:
    2 мар 2012
    Сообщения:
    15
    Симпатии:
    0
    есть форма, в зависимости от выбранных элементов формируется массив forms- тут все правильно;дальше по тексту.В переменную keyss записывается, например, "and этаж=2" и все правильно выводится.А вот, при передаче нескольких условий("and этаж=2" и "and район=Centralnii"), выводится так:

    район комнаты этаж
    Kovpakovskii 1 2
    Kovpakovskii 2 2
    Kovpakovskii 3 2
    Centralnii 3 2
    Centralinii 2 1
    Centralinii 4 9

    а должно при данных условиях так:

    район комнаты этаж
    Centralnii 3 2
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Мы не знаем, как выглядит форма и какие данные ты от неё получаешь и в каком виде.
    Перед строкой
    Код (PHP):
    1. foreach($forms as $keyss => $val) 
    напиши
    Код (PHP):
    1. echo('<pre>');
    2. print_r($forms);
    3. echo('</pre>'); 
    и выложи сюда.
     
  9. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    Код (Text):
    1.  
    2. SELECT * FROM table WHERE этаж='2' AND район = 'CENTRALNII'
    Так правильно и должно выводится то что надо, но у тебя получается создается другой запрос.
    Попробуй распечатать его, например так:
    Код (Text):
    1.  
    2. echo $sql = "SELECT район,комнаты,этаж FROM form_danniye where  ".$keyss."
    3. $result = mysql_query($sql,$db);
    Что напишет?
     
  10. veteran

    veteran Активный пользователь

    С нами с:
    2 мар 2012
    Сообщения:
    15
    Симпатии:
    0
    там кавычек одних нехватает; c кавычками выдает тоже что и при моем запросе.
     
  11. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    Чувствуется очень секретная форма, раз уж ты так за код держишься =)
     
  12. veteran

    veteran Активный пользователь

    С нами с:
    2 мар 2012
    Сообщения:
    15
    Симпатии:
    0
    не хотел просто лишний код писать-там все вроде правильно.


    $result = mysql_query("SELECT ids,name,types,relation,value FROM form_names ",$db);

    while($row = mysql_fetch_array($result))
    { echo'<tr><td><input type= '.$row['types'].' name=forms[tmp'.$row['ids'].']['.$row['name'].'] value= '.$row['value'].'></td><td>'.$row['value'].'</td></tr>';

    }

    echo'</table>';

    echo'<INPUT TYPE=submit name=search VALUE="Применить" ></form>';

    ?>

    <?php
    $forms=$_GET[forms];
    $search=$_GET[search];


    if(isset($_GET[search]))

    { и далее по тексту.

    Добавлено спустя 14 минут 7 секунд:
    sobachnik,вот что выводит на

    echo('<pre>');
    print_r($forms);
    echo('</pre>');

    Array
    (
    [tmp4] => Array
    (
    [этаж] => 2
    )

    [tmp0] => Array
    (
    [район] => Centralnii
    )

    )
     
  13. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    У тебя на каждой итерации внешнего цикла (foreach) значение переменной $keyss сбрасывается. Ей присваиваются значения tmp4, tmp0, ...
    Так можешь сделать:
    Код (PHP):
    1. $params = array();
    2. foreach($forms as $keyss => $val) {
    3.     while(list($ku, $mmk) = each($val))
    4.         $params[] = "`{$ku}` = '{$mmk}'";
    5. }
    6. $keyss = ' AND ' . implode(' AND ', $params);
    7. $result = mysql_query("SELECT район, комнаты, этаж FROM form_danniye WHERE id > 0 " . $keyss, $db); 
    Зачем там id > 0? Возможно наличие записей с отрицательным id? Или это просто из-за того, что значение переменной $keyss начинается с AND? Если второе, то можно избавиться от ненужного условия так:

    Код (PHP):
    1. $params = array();
    2. foreach($forms as $keyss => $val) {
    3.     while(list($ku, $mmk) = each($val))
    4.         $params[] = "`{$ku}` = '{$mmk}'";
    5. }
    6. $keyss = ' WHERE ' . implode(' AND ', $params);
    7. $result = mysql_query("SELECT район, комнаты, этаж FROM form_danniye" . $keyss, $db); 
    Добавлено спустя 2 минуты 57 секунд:
    P.S. И ещё почитай про SQL-инъекции. Сейчас можно взломать твой скрипт и сделать с базой данных всё что угодно.
     
  14. veteran

    veteran Активный пользователь

    С нами с:
    2 мар 2012
    Сообщения:
    15
    Симпатии:
    0
    1) на счет кода- спасибо;завтра проверю,отпишусь.
    2) WHERE id > 0 специально, чтобы and было) но вместо WHERE id > 0 ,будет другое условие.
    3) иньекции тут тоже предусматриваются);просто я решил сначала, сделать чтобы скрипт заработал как надо,а потом его доработаю.
     
  15. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $keyss=" and ".$ku."='".$mmk."'"; 
     
  16. veteran

    veteran Активный пользователь

    С нами с:
    2 мар 2012
    Сообщения:
    15
    Симпатии:
    0
    спасибо, sobachnik; все работает.