Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > в чем моя ошибка?


Автор: exe1389 20.7.2011, 10:44
написал простейшее меню поиска по бд
выводит все варианты в таблице что бы я не забил
Код

<form action="?" method="POST">
   art: <input type="art" value="<?=$_POST['art']?>"> <br>
   factory: <input type="art" value="<?=$_POST['factory']?>"> <br>
    <input type="submit" name="search" value="search">
</form>
<?php
    if($_POST['search']){
        mysql_pconnect("host","root","password");
        mysql_select_db("dbname");
        $query= "SELECT * FROM table WHERE art like '%".$_POST['art']."%' and factory like '%".$_POST['factory']."%'";
        $res= mysql_query($query);
        echo "<table>";
        while($row= mysql_fetch_assoc($res)){
            echo "<tr>";
                echo "<td>".$row['art']."</td>";
                echo "<td>".$row['factory']."</td>";
                echo "<td>".$row['price']."</td>";
                echo "<td>".$row['location']."</td>";
            echo "</tr>";
        }
        echo "</table>";
    }
?>




Автор: voral 20.7.2011, 10:52
у вас два безымянных input неизвестного типа art. Переменных с именами art и factory не существует

Добавлено через 56 секунд
Код

<form action="?" method="POST">
   art: <input type="text" name="art" value="<?=$_POST['art']?>"> <br>
   factory: <input type="text" name="factory" value="<?=$_POST['factory']?>"> <br>
    <input type="submit" name="search" value="search">
</form>


Автор: Gold Dragon 20.7.2011, 10:54
а что у тебя POST возвращает?

Автор: CruorVult 20.7.2011, 10:54
Цитата(exe1389 @  20.7.2011,  10:44 Найти цитируемый пост)
input type="art"

Сильно!  smile 

Автор: exe1389 20.7.2011, 10:56
тогда каким способом мне нужно сделать, что бы все это заработало? 
и искало по колонкам "art" и "factory" ?

Автор: CruorVult 20.7.2011, 11:03
Цитата(exe1389 @  20.7.2011,  10:56 Найти цитируемый пост)
тогда каким способом мне нужно сделать, что бы все это заработало? 

способом изучения основ веба а именно HTML!

Автор: voral 20.7.2011, 11:04
Я ж привел тебе html часть твоего файла. Копируй вместо своей и используй

Автор: exe1389 20.7.2011, 11:07
voral, спасибо

Автор: voral 20.7.2011, 11:13
Совет. Используй для отладки
Код

print_r($_POST);

можешь много нового узнать smile

Автор: exe1389 21.7.2011, 14:52
ещё один вопрос по этому коду:
нужно ли устанавливать кодировку по умолчанию?

Автор: Gold Dragon 21.7.2011, 14:59
это как? Ты в какой кодировке делаешь сайт?

Автор: exe1389 21.7.2011, 15:09
это не сайт а просто страничка, http://bot.amd-studio.ru
пока в браузер'е не поставишь кодировку не отображается нормально

Автор: Gold Dragon 21.7.2011, 15:26
я лично всегда прописываю кодировку в .htaccess и потом проблем не возникает.

Автор: voral 21.7.2011, 15:39
Цитата(exe1389 @  21.7.2011,  15:09 Найти цитируемый пост)
это не сайт а просто страничка, вот
пока в браузер'е не поставишь кодировку не отображается нормально

Браузеры очень демократично относятся к полноте кода страницы. Если чего то не хватает они ставят то, что считают необходимым. В принципе этим можно пользоваться, но до разу. Все просто: может в следующей версии одного из браузеров будет подставляться другое значние и ты получишь косяк. По этому нужно стараться придерживаться спецификаций html и сcs. И указывать не только кодировку, но и доктайп и теги html, head, title и body (и открывающие и закрывающие). Для FireFox есть плагин HTML Validator. Поставь его и в случе ошибок в HTML в статусбаре будет сигнальный значек - нажимаешь перечислены ошибки с коротким описанием. 
В общем с точки зрения браузеров это не обязательно, но сделай это обязательным для самого себя. Давать право "верстать" страницу браузерам - это плохо.

Автор: Gold Dragon 21.7.2011, 15:50
К примеру, если сайт написан в кодировке UTF-8, то не на всех серверах помогает указание кодировки только в head

Автор: voral 21.7.2011, 16:39
Цитата(Gold Dragon @  21.7.2011,  15:50 Найти цитируемый пост)
К примеру, если сайт написан в кодировке UTF-8, то не на всех серверах помогает указание кодировки только в head 

А тут дело не в html или UTF. Тут дело в кривой настройке сервера. И это не отменяет хорошего правила - следовать стандартам. 
Я по крайней мере последних лет 7 же и не встречал таких хостингов.

Автор: Gold Dragon 21.7.2011, 19:00
Цитата(voral @  21.7.2011,  17:39 Найти цитируемый пост)
А тут дело не в html или UTF.
и в том и другом и в браузерах.. всего по чуть-чуть и будет проблема.. так что не только спецификации следовать, но ещё и не особо полагаться на сервер. smile Я сейчас вообще жёстко перешёл на HTML5 smile

В любом случае код изначально не верен, вернее очень и очень опасный. Мало того, что запрос не обрабатывается после получения, но он ещё и напрямую вставляется в запрос к базе. 
exe1389, я так понимаю ты только начинаешь экспериментировать с передачей данных на сервер. Запомни, всё что приходит от клиента всегда опасно(!) А значит всегда нужно проверять на соответствие и экранировать.

И насколько я понял по коду, если в базе данных нет то ты напечатаешь 
Код

<table></table>
я бы не сказал что это соответствует спецификации ;)

Добавлено через 7 минут и 51 секунду
кстати, а почему mysql_pconnect?

Автор: exe1389 22.7.2011, 10:55
Да я только начинаю...
т.е. мне нужно создать файл с "конфигом" для подключения к базе и использовать такую схему? 
config.php:
Код

<?php 
$link = mysql_connect('host', 'user', 'password') or die("Не могу соединиться"); 
mysql_select_db('dbname', $link); 
?>

и основной код:
Код

<?php
function show_form(){ 
        require 'config.php'; 
<form action="?" method="POST">
   art: <input type="text" name="art" value="<?=$_POST['art']?>"> <br>
   factory: <input type="text" name="factory" value="<?=$_POST['factory']?>"> <br>
    <input type="submit" name="search" value="search">
</form>
    if($_POST['search']){
        $query= "SELECT * FROM arts WHERE art like '%".$_POST['art']."%' and factory like '%".$_POST['factory']."%'";
        $res= mysql_query($query);
        echo "<table>";
        while($row= mysql_fetch_assoc($res)){
            echo "<tr>";
                echo "<td>".$row['art']."</td>";
                echo "<td>".$row['factory']."</td>";
                echo "<td>".$row['price']."</td>";
                echo "<td>".$row['location']."</td>";
            echo "</tr>";
        }
        echo "</table>";
    }
?>
 



Автор: voral 22.7.2011, 12:39
Цитата(exe1389 @  22.7.2011,  10:55 Найти цитируемый пост)
т.е. мне нужно создать файл с "конфигом" для подключения к базе и использовать такую схему? 

Это зависит от задачи. Если у вас всего один скрипт - то можно и не надо.
Плохое место не здесь. Простейшее и безобидное. Что будет если посетитель введет символ % в оба поля? Или просто энтер нажмет (по сути у вас это и было в начале). Заметье  это очень безобидное - все го лишь увидят все ваши записи. А ведь можно добавит ввести символ кавычки (т.е. закончить ваше выражение и доработать sql запрос до состояния когда он будет, например, показывать гораздо больше информации


Автор: Gold Dragon 22.7.2011, 16:30
exe1389, если разобрать всё по пунктам (конечно всё зависит от проекта, но будем считать что он будет большим, то вот что нужно сделать, вернее что бы сделал я:

1. Разделил бы PHP и HTML.
т.е. одна функция выводит форму, другая обрабатывает, третья выводит результат. Плюс сюда же нужно вставить обработчик "что делать если ничего не введено" и обработчик при ошибки введённых данных

2. Для работы с базой воспользовался бы самостоятельным классом. Если не можешь или не хочешь писать свой, то их достаточное количество готовых. И в будущем если что-то будет меняться, то тебе достаточно просто внести изменения в класс, а не искать всё по всему коду. Да и не придётся обрабатывать всякое такое  while($row= mysql_fetch_assoc($res)), а просто отправить к примеру запрос и на выходе получить уже готовый массив

3. Однозначно ввёл проверку входящих данных. Хотя бы элементарное, удалить лишние провебы в начале и конце, удалить скрипты, удалить тэги, экранировать спецсимволы. А самый лучший вариант пользоваться регуляркой и оставлять нужное.. Например если это телефон то там не может быть букв, и наоборот, если это фамилия, то там только буквы..

4. Всё присваивал переменной и только в самом конце выводил бы на экран. Так тебе проще избежать ошибок.. например:
Код

$qqq = false;
    while($row= mysql_fetch_assoc($res)){
            $qqq .= "<tr>";
            $qqq .= "<td>".$row['art']."</td>";
            $qqq .= "<td>".$row['factory']."</td>";
            $qqq .= "<td>".$row['price']."</td>";
            $qqq .=  "<td>".$row['location']."</td>";
            $qqq .=  "</tr>";
        }
if($qqq){
     $qqq = "<table>".$qqq."</table>";
}
//**************
echo $qqq;


5. Хранил бы данные для подключения к базе в отдельном файле, например с правами 644. Так безопаснее. Да и всегда знаешь где у тебя данные по настройке.

Автор: exe1389 26.7.2011, 10:39
Gold Dragon, спасибо большое!

Автор: exe1389 19.8.2011, 08:23
В общем получилось как то вот так:
Код

<?php

function find($name='', $nm_nabor='', $art='', $factory=''){
    $db = mysql_connect ("localhost","---","---");
    mysql_select_db("amdstudiru_bot",$db);
    mysql_query("SET NAMES 'cp1251'");
    $result = mysql_query("SELECT * FROM arts WHERE productName LIKE '%$name%' AND collection LIKE '%$nm_nabor%' AND art LIKE '%$art%' AND factory LIKE '%$factory%' ",$db);
        if (!$result){
            echo "Запрос на выборку данных из базы не прошел. Напишите об этом администратору [email protected]. <br> <strong>Код ошибки:</strong>";
            exit(mysql_error());    
        }
        if (mysql_num_rows($result)>0){
                echo '<table width="0" border="1" cellpadding="2" cellspacing="0">';
                echo '<tr><td>название</td><td>набор</td><td>артикул</td><td>фабрика</td><td>цена</td><td>ссылка на страницу откуда была взята информация</td></tr>';
            
            while($myrow = mysql_fetch_array($result)){
                echo '<tr><td>'.$myrow['productName'].'</td><td>'.$myrow['collection'].'</td><td>'.$myrow['art'].'</td><td>'.$myrow['factory'].'</td><td>'.$myrow['price'].'</td><td>'.$myrow['location'].'</td></tr>';
            }
            
                echo '<table>';
        } else {
            echo 'Поиск не принес результатов! Измините параметры поиска.';
        }
}

function create_select(){
    $db = mysql_connect ("localhost","---","---");
    mysql_select_db("---",$db);
    mysql_query("SET NAMES 'cp1251'");
    $result = mysql_query("SELECT DISTINCT factory FROM arts",$db);
        if (!$result){
            echo "Запрос на выборку данных из базы не прошел. Напишите об этом администратору [email protected]. <br> <strong>Код ошибки:</strong>";
            exit(mysql_error());    
        }
        if (mysql_num_rows($result)>0){
            while($myrow = mysql_fetch_array($result)){
                echo '<option value="'.$myrow['factory'].'">'.$myrow['factory'].'</option>';
            }
        }
}

if ($_POST['status']=="finding"){

    parse_str($_POST['param'], $output); 
    $productName = $output['name'];
    $collection = $output['name_nabor'];
    $art = $output['art'];
    $factory = $output['fabrica'];
    find($productName, $collection, $art, $factory);

}

if ($_POST['status']=="spisok"){
    create_select();
}

?>

только пока не знаю как реализовать в этом чтобы искал не по одной таблице, а по 2-м
поможете ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)