Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> в чем моя ошибка? 
V
    Опции темы
voral
Дата 21.7.2011, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

Репутация: нет
Всего: нет



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

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

PM MAIL WWW   Вверх
Gold Dragon
Дата 21.7.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



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

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

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

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

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

Это сообщение отредактировал(а) Gold Dragon - 21.7.2011, 19:03


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
exe1389
Дата 22.7.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 7.4.2011

Репутация: нет
Всего: нет



Да я только начинаю...
т.е. мне нужно создать файл с "конфигом" для подключения к базе и использовать такую схему? 
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>";
    }
?>
 




Это сообщение отредактировал(а) exe1389 - 22.7.2011, 10:59
PM MAIL   Вверх
voral
Дата 22.7.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

Репутация: нет
Всего: нет



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

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


PM MAIL WWW   Вверх
Gold Dragon
Дата 22.7.2011, 16:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



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. Так безопаснее. Да и всегда знаешь где у тебя данные по настройке.


Это сообщение отредактировал(а) Gold Dragon - 22.7.2011, 16:32


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
exe1389
Дата 26.7.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 7.4.2011

Репутация: нет
Всего: нет



Gold Dragon, спасибо большое!
PM MAIL   Вверх
exe1389
Дата 19.8.2011, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 7.4.2011

Репутация: нет
Всего: нет



В общем получилось как то вот так:
Код

<?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-м
поможете ?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1122 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.