[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Упрощение кода
Druids
Ребят писал код, и получилось слишком много if, можно ли его упростить? или sql запросы упростить, а то сам понимаю что перемудрил. Если нужны коменты к коду, то смогу написать.

	
if ($_POST)
{
require_once ('connect.php');
$result_1 = mysql_query("SELECT name,money_1,money_2 FROM `person` WHERE name='".$name."'") or die ("Error !");
if ($person = mysql_fetch_assoc($result_1))
{
$result_2 = mysql_query("SELECT name FROM `bank` WHERE name='".$name."'") or die ("Error !");
if ($bank = mysql_fetch_assoc($result_2))
{
$schet=$_POST['schet'];
if ($schet > $person['money_1'])
{
echo "У вас на руках меньше денег, чем вы хотите положить на счет";
}
else
{
//Здесь мы переводим деньги на счет.
$sql="UPDATE bank SET schet='".$schet."' WHERE name='".$name."'" or die ("Error !");
$result_3 = mysql_query ($sql);
echo "Перевод успешен";
}
}

else
{
$schet=$_POST['schet'];
if ($schet > $person['money_1'])
{
echo "У вас на руках меньше денег, чем вы хотите положить на счет";
}
else
{
//Здесь мы переводим деньги на счет.
$sql="INSERT INTO bank SET schet='".$schet."','".$name."'" or die ("Error !");
$result_3 = mysql_query ($sql);
echo "Перевод успешен";
}
}
}

else
{
echo "ничерта не найдено в базе";
}
}




Спустя 41 минута, 30 секунд (12.08.2011 - 17:20) Michael написал(а):
Твой код небезопасен. читай

$result_2 = mysql_query("SELECT name FROM `bank` WHERE name='".$name."'") or die ("Error !");

так никто не проверяет наличие записи. Надо : SELECT COUNT(*) FROM и уже число проверять

Посмотри еще команду REPLACE в mysql.

Спустя 26 минут, 3 секунды (12.08.2011 - 17:46) Druids написал(а):
Можете как пример мне запрос написать, на моём примере? =)
P.S. Попахивает рекурсией =(
P.S.S. Такой запрос брал из книги по которой и обучался, да и до сих пор обучаюсь.
Автор: Андрей Шкрыль
Название: PHP это просто

Спустя 5 минут, 38 секунд (12.08.2011 - 17:52) Winston написал(а):
Это
Цитата (Druids @ 12.08.2011 - 16:38)
$result_1 = mysql_query("SELECT name,money_1,money_2 FROM `person` WHERE name='".$name."'") or die ("Error !");
if ($person = mysql_fetch_assoc($result_1))
{
  $result_2 = mysql_query("SELECT name FROM `bank` WHERE name='".$name."'") or die ("Error !");

Можно свести к
$result_1 = mysql_query("SELECT `p`.`name`, `p`.`money_1`,
`p`.`money_2`, `b`.`name`
FROM `person` `p`, `bank` `b`
WHERE name='"
. $name . "'") or die ("Error !");

Спустя 11 минут, 9 секунд (12.08.2011 - 18:03) Druids написал(а):
Цитата
$result_1 = mysql_query("SELECT `p`.`name`, `p`.`money_1`,
                                `p`.`money_2`, `b`.`name`
                        FROM `person` `p`, `bank` `b`
                        WHERE name='" . $name . "'") or die ("Error !");


что в данном случае p и b
Извиняюсь, сообразил уже. Спасибо

Спустя 1 минута, 49 секунд (12.08.2011 - 18:04) Winston написал(а):
Цитата (Druids @ 12.08.2011 - 18:03)
`person` `p`, `bank` `b`

Псевдонимы `person` `p`, `bank` `b`, чтобы меньше букафф было :)
Можно так писать, если тебе удобней

SELECT `person`.`name`, `person`.`money_1`,
`person`.`money_2`, `bank`.`name`




Спустя 35 секунд Winston написал(а):
То есть, указываем имя_таблицы.имя_столбца

Спустя 2 минуты, 6 секунд (12.08.2011 - 18:07) Druids написал(а):
Такую-же запись и при записи в базе можно использовать?
Просто тут код слегка не полный, точнее ещё не до конца написанный =)
И как выше говорили о Инъекции, защищен ли он?

Спустя 2 минуты, 8 секунд (12.08.2011 - 18:09) Winston написал(а):
Цитата (Druids @ 12.08.2011 - 18:07)
Такую-же запись и при записи в базе можно использовать?

В окне SQL запроса написать это имеешь ввиду ?

Спустя 2 минуты, 21 секунда (12.08.2011 - 18:11) Druids написал(а):
Цитата (Winston @ 12.08.2011 - 15:09)
Цитата (Druids @ 12.08.2011 - 18:07)
Такую-же запись и при записи в базе можно использовать?

В окне SQL запроса написать это имеешь ввиду ?

нет не совсем...
я так понял, что здесь мы просто объединили 2 запроса в 1.

Просто мне нужно будет записывать полученный результат, в 2 таблицы. и я так понял, что таким же способом как вы мне написали, можно будет сделать?!

Спустя 1 минута, 41 секунда (12.08.2011 - 18:13) Winston написал(а):
Одним запросом в две таблицы записать ?

Спустя 2 минуты, 13 секунд (12.08.2011 - 18:15) Druids написал(а):
Да. Именно так.
И с вашим преобразованием, вот с этой строкой что произойдет?
if ($person = mysql_fetch_assoc($result_1))
{

Так и оставляем её?

Спустя 1 минута (12.08.2011 - 18:16) Winston написал(а):
Если нужна только одна запись, то так и оставляем.

Спустя 1 минута, 46 секунд (12.08.2011 - 18:18) Druids написал(а):
Понял, спасибо за небольшую лекцию. Опробую всё завтра, а сейчас пойду спать, а то времени 2 часа ночи =(

Спустя 5 минут, 51 секунда (12.08.2011 - 18:24) Winston написал(а):
ОФФТОП
Цитата (Druids @ 12.08.2011 - 18:18)
а то времени 2 часа ночи

А у меня 18-25 tongue.gif

Спустя 8 минут, 6 секунд (12.08.2011 - 18:32) Invis1ble написал(а):
Druids
как-то так, не уверен, что сработает )
if ($_POST)
{
require_once ('connect.php');

mysqli_query(
"DELIMITER //
CREATE PROCEDURE transaction (u_name VARCHAR(255), amount INT)
LANGUAGE SQL
BEGIN
DECLARE money INT NULL;
SET money = (SELECT `money_1` FROM `person` WHERE `name` = u_name);
IF (money IS NOT NULL) THEN
BEGIN
IF ((SELECT COUNT(*) FROM `bank` WHERE `name` = u_name) = 0) THEN
INSERT INTO `bank` (`name`, `schet`) VALUES (u_name, amount);
ELSE
UPDATE `bank` SET `schet` = amount WHERE `name` = u_name;
END IF;
END;
END IF;
END //
CALL transaction('"
. mysqli_escape_string($_POST['name']) . "', " . (int)$_POST['schet'] . ")"
) or die(mysqli_error());

echo mysqli_affected_rows() ? "Перевод успешен" : "У вас на руках меньше денег, чем вы хотите положить на счет";
}

Спустя 12 минут, 28 секунд (12.08.2011 - 18:44) Invis1ble написал(а):
Если `name` сделать UNIQUE, то можно сократить, как написал Michael
DELIMITER //
CREATE PROCEDURE transaction (u_name VARCHAR(255), amount INT)
LANGUAGE SQL
BEGIN
IF ((SELECT COUNT(*) FROM `person` WHERE `name` = u_name) != 0) THEN
REPLACE INTO
`bank` (`name`, `schet`) VALUES (u_name, amount);
END IF;
END//

Спустя 8 часов, 37 минут, 2 секунды (13.08.2011 - 03:21) Druids написал(а):
Invis1ble
Не, такой запрос не для меня =( я конечно понимаю, что всё красиво написано, нет лишнего кода и т.д. Ноя его просто не понимаю =( Спасибо за старания - постараюсь разобраться с ним.

Спустя 20 минут, 3 секунды (13.08.2011 - 03:41) Druids написал(а):
Winston
Вот что говорит mysql на твой запрос =)
Цитата
Column 'name' in where clause is ambiguous

Спустя 10 часов, 21 минута, 49 секунд (13.08.2011 - 14:03) Winston написал(а):
Цитата (Druids @ 13.08.2011 - 03:41)
Вот что говорит mysql на твой запрос

Покажи свой запрос.

Спустя 10 минут, 21 секунда (13.08.2011 - 14:13) Michael написал(а):
Winston, у тебя в запросе есть `p`.`name` и `b`.`name`, а проверка просто name = , поэтому и ошибка


Спустя 3 минуты, 10 секунд (13.08.2011 - 14:17) Winston написал(а):
Michael
Да! Точно! Спасибо ! smile.gif

Спустя 10 минут, 18 секунд (13.08.2011 - 14:27) Druids написал(а):
т.е. мне надо убрать из запроса p и b, или в where дописать, это p и b?

Спустя 6 минут, 27 секунд (13.08.2011 - 14:33) Winston написал(а):
Druids
Допиши у where
WHERE `p`.`name` = '" . $name . "' AND  `b`.`name` = '" . $name . "'

Спустя 1 час, 10 минут, 18 секунд (13.08.2011 - 15:44) Druids написал(а):
if ($_POST)
{
require_once ('connect.php');
$result_1 = mysql_query("SELECT `p`.`name`, `p`.`money_1`,
`p`.`money_2`, `b`.`name`
FROM `person` `p`, `bank` `b`
WHERE `p`.`name` = '"
. $name . "' AND `b`.`name` = '" . $name . "'") or die (mysql_error());
if ($person = mysql_fetch_assoc($result_1))
{
if ($bank = mysql_fetch_assoc($result_1))
{
$schet=$_POST['schet'];
if ($schet > $person['money_1'])
{
echo "У вас на руках меньше денег, чем вы хотите положить на счет";
}
else
{
//Здесь мы переводим деньги на счет.
$sql="UPDATE bank SET schet='".$schet."' WHERE name='".$name."'" or die ("Error !");
$result_3 = mysql_query ($sql);
echo "Перевод успешен";
}
}

else
{
$schet=$_POST['schet'];
if ($schet > $person['money_1'])
{
echo "У вас на руках меньше денег, чем вы хотите положить на счет";
}
else
//Здесь мы переводим деньги на счет.
$sql="INSERT INTO bank SET schet='".$schet."','".$name."'" or die ("Error !");
$result_3 = mysql_query ($sql);
echo "Перевод успешен";
}
}



Вот такой код получился, НО получается так что не пишется в базу код =(
а точнее вот это условие не выполняется, но пишется, что перевод успешен.
								$sql="INSERT INTO bank SET schet='".$schet."','".$name."'" or die ("Error !");
$result_3 = mysql_query ($sql);

Спустя 4 минуты, 4 секунды (13.08.2011 - 15:48) Winston написал(а):
А, что ты написал вообще ? blink.gif



Спустя 26 секунд Winston написал(а):
SET для UDATE а для инсерта используй VALUES

Спустя 1 минута, 51 секунда (13.08.2011 - 15:50) Invis1ble написал(а):
Winston
для insert можно и set заюзать, только не в таком виде, как у ТС в коде. там ошибка в синтаксисе

Спустя 51 секунда (13.08.2011 - 15:50) Invis1ble написал(а):
$sql="INSERT INTO bank SET schet='".$schet."',`name` = '".$name."'" or die ("Error !");

Спустя 27 секунд (13.08.2011 - 15:51) Winston написал(а):
Может ты так имел ввиду ?
$sql="UPDATE `bank` SET `schet` = '".$schet."' WHERE `name` = '".$name."'";
$result_3 = mysql_query ($sql) or die ("Error !");

Или так ?
$sql="INSERT INTO `bank` (`schet`, `name`) VALUES ('".$schet."', '".$name."')";
$result_3 = mysql_query ($sql) or die ("Error !");

Спустя 16 секунд (13.08.2011 - 15:51) Druids написал(а):
просто, вот этот участок - работал нормально не знаю, как может быть связанно с тем что изменялось...

$sql="UPDATE bank SET schet='".$schet."' WHERE name='".$name."'" or die ("Error !");
$result_3 = mysql_query ($sql);
echo "Перевод успешен";

Спустя 3 минуты, 40 секунд (13.08.2011 - 15:55) Winston написал(а):
Druids
Куда ты or die пихаешь ? :blink:
$sql="UPDATE bank SET schet='".$schet."' WHERE name='".$name."'";
$result_3 = mysql_query ($sql) or die ("Error !");
echo "Перевод успешен";

Спустя 44 секунды (13.08.2011 - 15:55) Michael написал(а):
Какой ужас, человек наугад программирует. ohmy.gif
Подучи лучше сперва sql и назначение php функций для работы с БД.
Тогда может быть сможешь более понимать хотя бы и те советы, которые получаешь(включая проигнорированный мой)...

Спустя 2 минуты, 21 секунда (13.08.2011 - 15:58) Invis1ble написал(а):
ха, я or die() и сам провтыкал smile.gif
Быстрый ответ:

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