[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Работа с базой
koala
Написал скрипт который ос страницы add.php заносит в базу данные введенные с формы и потом выводит все данные из базы (цыклом) на главную страницу (index.php).

Вот код главной страницы:


<?php
$db = mysql_connect("localhost","link","password"); /* Подключаемся к базе */
mysql_select_db("link",$db);

$title = $_POST['title']; /* получаем данные с add.php */
$link = $_POST['link'];
$description = $_POST['description'];

$result = mysql_query("INSERT INTO site(title,link,description) VALUES ('$title','$link','$description')",$db); /* Записываем данные в базу */
$result = mysql_query("SELECT * FROM site",$db); /* получеам данные из базы */
$myrow = mysql_fetch_array($result);

do /* создаем цыкл для вывода всех данных из базы */
{
printf("<br>Сайт - %s<br>Названия - %s<br>Ссылка - %s<br>Описание<br>", $myrow['id'], $myrow['title'], $myrow['link'], $myrow['description']);
}
while($myrow = mysql_fetch_array($result));
?>


Код страницы add.php :

<?php 
$db = mysql_connect("localhost","link","password");
mysql_select_db("firstbd",$db);
echo <<< HERE
<table border="0" class="table">
<
tr>
<
td>
<
center><form action="index.php" method="post" name="form">
<
div class="text">Название сайта (макс. 100 символов):</div><input name="title" type="text" size="50" maxlength="100"><br>
<
div class="text">Ссылка на сайт (макс. 50 символов):</div><input name="link" type="text" size="50" maxlength="50"><br>
<
div class="text">Описание сайта (макс. 1000 символов):</div><input name="description" type="text" size="50" maxlength="1000"><br>
<
input name="submit" type="submit" value="Добавить"></center>
</
form>
</
td>
</
tr>
</
table>
HERE;
?>


Сначала было все номрально, данные получаем страница index.php и там они записываются в базу и потом выводятся на главную страницу. Но если обновить страницу то те самые данные опять заносятся в базу и выводятся на главную страницу те самые данные.

Как сделать так, что бы перед тем как добавить в базу данные, проверить их на уникальность? И как сделать что бы данные из формы приходили только тогда когда пользователь вводит их, а не когда обновляется главная страница?

Заранее спасибо.



Спустя 4 часа, 18 минут, 17 секунд (15.03.2010 - 00:55) silius написал(а):
1. Проверить на уникальность:

перед тем как ложишь данные в базу, сделай проверку есть ли такие данные в базе
SELECT ... WHERE ...
if($result=mysql_fetch_array){
такие данные существуют
exit
}

но ты уверен, что тебе уникальность нужна?

2. Чтобы после обновления повторно не сохранялось:

да возьми ты и влипи в конец header:
header(location...) и переправь кудЫ нибудь, вот твоя страница и обновиться

Спустя 2 минуты, 16 секунд (15.03.2010 - 00:58) silius написал(а):
на кой фиг в add.php соединение с базой открываешь? smile.gif

Спустя 2 часа, 3 минуты, 56 секунд (15.03.2010 - 03:02) Bezdna написал(а):
Для начала сюда:
http://phpforum.ru/index.php?showtopic=21916

Спустя 15 часов, 24 минуты, 46 секунд (15.03.2010 - 18:26) Awilum написал(а):
Данные пришедшие из add.php для добавления никак у вас не проверяются, это прямая угроза SQL-иньекции.

Внедрение SQL-кода

После добавления делаете редирект на любую страницу, хоть и на index.php

Спустя 18 минут, 13 секунд (15.03.2010 - 18:45) Игорь_Vasinsky написал(а):
Для обеспечения безопастности sql инъекций необходимо прогнать нанные через:

$post = htmlspecialchars($post); урезание html тегов
$post = addslashes($post); - экранировка (добавление \ перед ' )


Спустя 2 минуты, 56 секунд (15.03.2010 - 18:47) Awilum написал(а):
если память мне не изменяет, то htmlspecialchars(); надо делать на выводе

на вводе надо юзать более новую функцию

mysqli
mysqli_real_escape_string();

mysql
mysql_real_escape_string();

Спустя 3 минуты, 33 секунды (15.03.2010 - 18:51) Игорь_Vasinsky написал(а):
как на вводе, на вводе данные тока JS можно цеплять, ты наверное имел ввиду при передаче и до записи.

Спустя 2 минуты, 11 секунд (15.03.2010 - 18:53) Awilum написал(а):
Игорь_Vasinsky

SELECT

INSERT

.

Спустя 2 минуты, 42 секунды (15.03.2010 - 18:56) Игорь_Vasinsky написал(а):
ну так по моему примеру они ещё раньше были обезопасены и не допущены в случае угрозы

Спустя 1 минута, 6 секунд (15.03.2010 - 18:57) silius написал(а):
Ребят, со строками много чего делать можно, и в этой теме всё не перечислить, особенно не зная что конкретно нужно, да и не в этом заключалась проблема, поэтому можно посоветовать справочник: http://www.php.su/functions/?page=cat_string smile.gif думаю пригодится

Спустя 1 минута, 3 секунды (15.03.2010 - 18:58) Игорь_Vasinsky написал(а):
может быт...тока я предпочитаю давать ответ

Спустя 26 минут, 9 секунд (15.03.2010 - 19:24) koala написал(а):
Спасибо всем за советы и за сссылки, все прочитал =)

Все получается, но вот тут одно но.
Хочю сделать в скрипте запрос к базе и узнать последний id, потом создать переменные и каждой присвоить значения из базы (последнего id), ну там title link и т.д.

Пробовал одним способом но мне выводит только номер id и еще слова с номером. А мне нужно что бы номер id записывался в отдельную переменную потом сделать запрос к базе типа

SELECT * FROM site WHERE id="$id"


Где $id - номер последней переменной. А потом уже сверить данные, и если данные одинаковые то прекратить работу скрипта.

Спустя 5 минут, 31 секунда (15.03.2010 - 19:30) Игорь_Vasinsky написал(а):
попробуй

SELECT `id`  FROM `site`  ASC LIMIT 1


ASC - сортируем по убыванию
LIMIT 1 - показываем последний

Спустя 10 минут, 13 секунд (15.03.2010 - 19:40) koala написал(а):
Игорь_Vasinsky, спасибо но выводить Resource id #4 и при этом не правильно так как в базе больше 10 записей.

Мне нужно что бы выводило просто число, например 5.

Спустя 23 минуты, 17 секунд (15.03.2010 - 20:03) Awilum написал(а):
$query = "SELECT * FROM `table` WHERE `id`='$page' LIMIT 1";
$result = $mysqli->query($query);
$data = $result->fetch_assoc();
echo $data['id'];

Спустя 10 минут, 14 секунд (15.03.2010 - 20:13) Игорь_Vasinsky написал(а):
SELECT * FROM `site` ASC LIMIT 0,1

через ассиоц. масиив в цикле получай

попробуй

мне просто у себя проверять некогда


$query = "SELECT * FROM `table` WHERE `id`='$page' LIMIT 1  ASC или DESC";
$result = $mysqli->query($query);
$data = $result->fetch_assoc();
echo $data['id'];

Спустя 35 минут, 47 секунд (15.03.2010 - 20:49) Awilum написал(а):
Игорь_Vasinsky
Цитата
$query = "SELECT * FROM `table` WHERE `id`='$page' LIMIT 1  ASC или DESC";


какой смысл в этом запросе несет сортировка(отсортирует одну строчку LIMIT 1) ? если я получу тот ID который запросил.



Спустя 3 минуты, 38 секунд (15.03.2010 - 20:53) koala написал(а):
Все ровно не помогает =(

Выкладыаю полный код index.php :

<html>
<
head>
<
title>Сайты</title>
</
head>
<
body>
<?php
include ("config.php");
$title = $_POST['title'];
$link = $_POST['link'];
$description = $_POST['description'];

$db = mysql_connect($hostname,$login,$password); /* коннекс к базе */
mysql_select_db("link",$db);

if ($title == true & $link == true & $description == true) /* если есть что то в title и т.д. */
{
$query = "SELECT * FROM `site` WHERE `id`='$page' LIMIT 1 DESC";
$data = mysql_fetch_assoc($query);
echo $data['id'];

if ($title_test == $title or $link_test == $link or $description_test == $description) /* Проверяем на кникальность */
{
$result = mysql_query("UPDATE site SET title='$title', link='$link', description='$description' WHERE id='$title_test' ASC LIMIT 1"); /* обновляем данные */
}
$result = mysql_query("INSERT INTO site(title,link,description) VALUES ('$title','$link','$description')",$db);
$result = mysql_query("SELECT * FROM site", $db);
$myrow = mysql_fetch_assoc($result);

$table = "<table border='1' align='center'>";
do
{
$table .= "<tr>";
$table .= "<td>".$myrow['title']."</td>";
$table .= "<td>".$myrow['link']."</td>";
$table .= "<td>".$myrow['description']."</td>";
$table .= "</tr>";
}
while($myrow = mysql_fetch_assoc($result));
$table .="</table>";
echo $table;
}
else
{
exit();
}
?>
</body>
</
html>[php]

Вот add.php :

[
php]<html>
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<
title>Добавления сайта</title>
<
link href="style.css" rel="stylesheet" type="text/css">
</
head>
<?php
echo <<< HERE
<table border="0" class="table">
<
tr>
<
td>
<
center><form action="index.php" method="post" name="form">
<
div class="text">Название сайта (макс. 100 символов):</div><input name="title" type="text" size="50" maxlength="100"><br>
<
div class="text">Ссылка на сайт (макс. 50 символов):</div><input name="link" type="text" size="50" maxlength="50"><br>
<
div class="text">Описание сайта (макс. 1000 символов):</div><input name="description" type="text" size="50" maxlength="1000"><br>
<
input name="submit" type="submit" value="Добавить"></center>
</
form>
</
td>
</
tr>
</
table>
HERE;
?>
<body>
</
body>
</
html>


Комментария пожалуйста опишите что где сделали, буду очень благодарен. Вроде простой скрипт а над ним парюсь уже второй день sad.gif

Спустя 3 минуты, 49 секунд (15.03.2010 - 20:57) Awilum написал(а):
koala
первой строчкой

error_reporting(E_ALL);


потом двигаться дальше...

Спустя 40 минут, 11 секунд (15.03.2010 - 21:37) twin написал(а):
Ну вот на сколько терпежу хватило. Дальше вообще ужос.
<?php 
include ("config.php");
// Поставь тут это, что бы видеть, где ошибки
error_reporting(E_ALL);
// Это нужно делать так (если не нужен 0):
$title = !empty($_POST['title'])?$_POST['title']:NULL;
// Или так, если он возможен
$link = (isset($_POST['link']) && $_POST['link'] !='')?$_POST['link']:NULL;
// Тут сам
$description = $_POST['description'];

$db = mysql_connect($hostname,$login,$password); /* коннекс к базе */
mysql_select_db("link",$db);
// Почему так? Откуда там true? И что за операторы?
//if ($title == true & $link == true & $description == true) /* если есть что то в title и т.д. */

if ($title && $link && $description)
{
// Не нужно тут перезаписи. Сам и запутался.
// $query = "SELECT * FROM `site` WHERE `id`='$page' LIMIT 1 DESC";
// $data = mysql_fetch_assoc($query);


$result = mysql_query("SELECT * FROM `site`
WHERE `id`= "
. (int)$page
) or die(mysql_error());

$data = mysql_fetch_assoc($result);
echo $data['id'];

Брось поповский курс, как малые дети всяку каку в рот тяните...

Спустя 1 час, 40 минут, 54 секунды (15.03.2010 - 23:18) koala написал(а):
twin, спасибо. Скачал курсы Попова... ради интереса. Потом захотел серьезно заниматься PHP =)

Спустя 3 дня, 11 часов, 28 минут, 29 секунд (19.03.2010 - 10:46) kaktus2010 написал(а):
Привет всем!
Кто знает подскажите.
У меня проблема. Пытаюсь создать базу данных из php, но ничего не получаетя.
@$db=mysql_pconnect("localhost", "root");
mysql_create_db("jygu");
Выдает ошибку:
Fatal error: Call to undefined function mysql_create_db()
В чем проблема?

Спустя 26 минут, 32 секунды (19.03.2010 - 11:13) silius написал(а):
kaktus2010

а где пароль когда коннектишься?

Спустя 3 часа, 29 минут, 4 секунды (19.03.2010 - 14:42) kaktus2010 написал(а):
SILIUS
Я работаю в денвере и пока только на своем компе поэтому пока без пароля.
Потом сделаю.

Спустя 13 минут, 27 секунд (19.03.2010 - 14:55) Игорь_Vasinsky написал(а):
@$db=mysql_pconnect("localhost", "root", "");
на денвере так на денвере, даже если как ты говоришь что не используешь пароль - так скажи об этом mysql_pconnect

3 аргумента для подключения к базе: сервер - логин - пароль (даже если пустой)

Спустя 42 минуты, 57 секунд (19.03.2010 - 15:38) Игорь_Vasinsky написал(а):
Спасибо Игорь, всё получилось...... не стоит, пожайлуста.

Спустя 1 час, 14 минут, 26 секунд (19.03.2010 - 16:53) silius написал(а):
Игорь_Vasinsky
biggrin.gif

Спустя 1 час, 43 минуты, 45 секунд (19.03.2010 - 18:36) koala написал(а):
Сразу после вопроса предыдущего пользователя я попробовал создать базу, но у меня вылезла ошибка, хотя все делал по книге.

 <?php 
error_reporting(E_ALL);
$db = mysql_connect("localhost","link","password");
mysql_create_db("test_db",$db);
?>


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

Спустя 6 часов, 2 минуты, 52 секунды (20.03.2010 - 00:39) silius написал(а):
Попробуй сделать так:


<?php

$db = mysql_connect("localhost","link","password") or
die(mysql_errno($db).mysql_error($db));
mysql_create_db("test_db",$db) or
die(mysql_errno($db).mysql_error($db));

?>


и напиши ошибку, которую выбьет

Спустя 1 час, 24 минуты, 35 секунд (20.03.2010 - 02:04) kaktus2010 написал(а):
Цитата (Игорь_Vasinsky @ 19.03.2010 - 11:55)
@$db=mysql_pconnect("localhost", "root", "");
на денвере так на денвере, даже если как ты говоришь что не используешь пароль - так скажи об этом mysql_pconnect

3 аргумента для подключения к базе: сервер - логин - пароль (даже если пустой)

Все равно ошибку выдает. Пустой пароль не помагает.

Спустя 9 часов, 26 минут, 28 секунд (20.03.2010 - 11:30) koala написал(а):
silius, вот ошибка:

Fatal error: Call to undefined function mysql_create_db() in Q:\home\localhost\www\xak\index.php on line 6

Спустя 59 секунд (20.03.2010 - 11:31) koala написал(а):
kaktus2010, зайди в phpmyadmin, там нажми на ссылку привелегии и создай нового пользователя с правами администратора и дай ему пароль и т.д.

Спустя 7 часов, 20 минут, 51 секунда (20.03.2010 - 18:52) koala написал(а):
 if (isset($_POST['ok']))
{
$text1 = $_POST['text1']; //создаем переменные и присваиваем им значения из формы
$text2 = $_POST['text2'];
$text3 = $_POST['text3'];

$result = mysql_query("INSERT INTO site(site_name,site_link,description) VALUES ($text1,$text2,$text3)",$db); // Записываем данные в базу
header('location: '. $_SERVER['PHP_SELF']); // Обновляем страницу
}


При запуске скрипта происходит ошибка:

Notice: Undefined variable: res in Q:\home\localhost\www\xak\add.php on line 47


Собственно вопрос: можно ли так делать? Я имею ввиду использовать if else для обращения к базе.

Спустя 4 минуты, 48 секунд (20.03.2010 - 18:57) Adil написал(а):
не можно, а нужно

Спустя 45 минут, 24 секунды (20.03.2010 - 19:42) Игорь_Vasinsky написал(а):
Цитата
Notice: Undefined variable: res in Q:\home\localhost\www\xak\add.php on line 47



так ты не определил переменную res

или опечатался и вместо $res вписал res

а вообще воспользуйся советом twinа и используй говорящие названия как функций так и переменных

$res - $result

Спустя 1 минута, 41 секунда (20.03.2010 - 19:44) Игорь_Vasinsky написал(а):
Цитата
xak\add.php


что то страшное готовится появиться на свет

Спустя 4 минуты, 10 секунд (20.03.2010 - 19:48) Игорь_Vasinsky написал(а):
Потом:

ты просто не правильно поставил вопрос.

Тут ты не: "использовать if else для обращения к базе"

а ставишь условие: если "isset($_POST['ok']"

то уже записываешь данные в базу.

Спустя 23 минуты, 12 секунд (20.03.2010 - 20:11) koala написал(а):
Игорь_Vasinsky, проблема была в кавычках ''.

Вот правильный код:
if (isset($_POST['ok']))
{
$text1 = $_POST['text1'];
$text2 = $_POST['text2'];
$text3 = $_POST['text3'];

$result = mysql_query("INSERT INTO site(site_name,site_link,description) VALUES ('$text1','$text2','$text3')",$db);

header('location: '. $_SERVER['PHP_SELF']);

Спустя 8 минут, 4 секунды (20.03.2010 - 20:19) Игорь_Vasinsky написал(а):
Цитата
header('location: '. $_SERVER['PHP_SELF']);


а зачем обновляешь странирцу, будет попытка (а скорее всего перезапись) запись повторно

Спустя 51 минута, 33 секунды (20.03.2010 - 21:11) koala написал(а):
Игорь_Vasinsky, перезаписи нет, это делаю для того что бы не было перезаписи =)
долго искал способы, самый подходящий делать редирект на главную, тоисть на add.php

Спустя 23 минуты, 11 секунд (20.03.2010 - 21:34) Игорь_Vasinsky написал(а):
Может напрасный спор, но может я чёто путаю:

$_SERVER['PHP_SELF']
- сама страница на которой счас юзер

add.php - обработчик формы

вот и получается что данные переданные из формы обрабатываются на add.php и записываются в базу там же, потом страница обновляется и происходит тоже самое... или нет ?

Спустя 8 минут, 11 секунд (20.03.2010 - 21:42) twin написал(а):
Цитата
или нет ?

нет. POST уже не будет при втором заходе.

Спустя 8 минут, 17 секунд (20.03.2010 - 21:51) Игорь_Vasinsky написал(а):
twin спасиб, значит это и есть самый эффективный способ защиты от F5 ?

Спустя 55 минут, 30 секунд (20.03.2010 - 22:46) koala написал(а):
Игорь_Vasinsky, насчет самого эфективного не знаю, но мне помогает =) Данные заново не передаются.

Спустя 24 минуты, 43 секунды (20.03.2010 - 23:11) twin написал(а):
Игорь_Vasinsky
Цитата
twin спасиб, значит это и есть самый эффективный способ защиты от F5 ?
от F5 да, но есть еще история и кнопка "вернуться". По этому от флуда это не спасет в полной мере.

Спустя 2 минуты, 51 секунда (20.03.2010 - 23:14) Игорь_Vasinsky написал(а):
twin киньте пожалуста ссылку, я знаю у вас должна быть статья на эту тему. спасибо.

Спустя 3 часа, 30 минут, 59 секунд (21.03.2010 - 02:45) kaktus2010 написал(а):
Цитата (koala @ 20.03.2010 - 08:31)
kaktus2010, зайди в phpmyadmin, там нажми на ссылку привелегии и создай нового пользователя с правами администратора и дай ему пароль и т.д.

Создать конечно можно, но считывание и запись в базу данных у меня при таком написании работает.
db=mysql_pconnect("localhost", "root");
Не работает только создание базы данных.

Спустя 23 часа, 22 минуты, 30 секунд (22.03.2010 - 02:07) Guest написал(а):
Все получилось вот в таком написании:
@$db=mysql_pconnect("localhost", "root");
$query="create database ".$namebd;
$r=mysql_query($query);
где $namebd -имя базы данных задается ранее.

Спустя 2 минуты, 47 секунд (22.03.2010 - 02:10) kaktus2010 написал(а):
Цитата (Guest @ 21.03.2010 - 23:07)
Все получилось вот в таком написании:
@$db=mysql_pconnect("localhost", "root");
$query="create database ".$namebd;
$r=mysql_query($query);
где $namebd -имя базы данных задается ранее.

Забыл войти

Спустя 20 часов, 22 минуты, 11 секунд (22.03.2010 - 22:32) koala написал(а):
$total_base_number = mysql_query("SELECT count(*) FROM site",$db);


Запросом к базе получаю количество записей в базе.

Пытаюсь вывести на экран количество записей:

echo 'В базе '. $total_base_number .'На страницу выведено '. $total_page .' сайтов.';


Но почему то выводится Resource id #6, при этом записей в базе намного больше. Кто то встречался с такой проблемой?

Спустя 7 минут, 23 секунды (22.03.2010 - 22:40) silius написал(а):
По такому запросу ты получишь полное количество записей(не только в столбце, ну и в строках) - это получиться матрица:

Например:
id name
1 a
2 b
3 c
4 d

ты получишь не 4, а 8 если нужно 4, то...

$total_base_number = mysql_query("SELECT count(id) FROM site",$db) or die ("Error");
$result=mysql_fetch_row($total_base_number);
echo 'В базе: '. $result.".";


если 8, то аналогично, только в count замени id на *, как у тебя стоит.

Спустя 14 минут, 58 секунд (22.03.2010 - 22:55) koala написал(а):
Выводит: В базе Array

Наверно что то не так.


Спустя 1 минута, 53 секунды (22.03.2010 - 22:56) silius написал(а):
koala
извеняюсь, забыл. Пробуй

...
echo 'В базе: '. $result[0].".";

Спустя 46 секунд (22.03.2010 - 22:57) Nikitian написал(а):
Цитата (silius @ 22.03.2010 - 19:40)
По такому запросу ты получишь полное количество записей(не только в столбце, ну и в строках) - это получиться матрица:

Чушь несёте. Count() возвращает число, либо массив чисел, если используется группировка. Здесь группировки нет, поэтому будет одно число - количество записей в таблице. Если объяснять на примере pma, то вернётся количество строк. Столбцы нет смысла считать, ибо в таблице в каждой записи их одинаковое количество.

Спустя 4 минуты, 43 секунды (22.03.2010 - 23:02) silius написал(а):
Nikitian
ага, и правда, только что попробывал. Странно, как то ставил *, так оно мне не то что нужно показало tongue.gif

Спустя 6 минут, 25 секунд (22.03.2010 - 23:08) koala написал(а):
silius, спасибо, получилось. И заодно обьясните, зачем писать $result[0] а не например $result[1] ?

Спустя 10 минут, 30 секунд (22.03.2010 - 23:19) silius написал(а):
koala
$result - в твоём случае это массив, у которого 1-н элемент, а у массивов(если не указываем их вручную) начинаются с 0.

если бы было к примеру:
$sqlquery=mysql_query("SELECT id, name FROM table") or die ("Error");
$result=mysql_fetch_row($sqlquery);

в этом случае id мы можем взять по адресу $result[0], а name - $result[1]
Вот такие пироги smile.gif

Спустя 30 минут, 51 секунда (22.03.2010 - 23:50) koala написал(а):
Понятно. На будущие буду знать =)


_____________
Vi Veri Veniversum Vivus Vici
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.