Перейти к содержимому


Партнерская программа Kredov

Не могу понять происхождение ошибок

#1 tro9an

tro9an
  • Пользователь
  • 34 сообщений
  • Репутация: 0
0

Отправлено 22 Сентябрь 2010 - 18:35

есть код:
<?php include ("db.php"); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Главная страница</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>

<body>
<table width="800" align="center" class="b_t">
<tr>
<td>
<?php
$result=mysql_query("SELECT id,title FROM for");
$myrow=mysql_fetch_array($result);
do {
printf ("
<table width='70%' align='left' class='b_t'>
<tr>
<td><p><a href='cat.php?id=%s'>%s</a></p></td>
</tr>
</table>",$myrow['id'],$myrow['title']);
}
while ($myrow=mysql_fetch_array($result));
?>

<table width="25%" align="left" class="b_t">
<tr>
<td height="20"> </td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>

выдаёт ошибку
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in V:\home\localhost\www\forum\index.php on line 16

Warning: printf() [function.printf]: Too few arguments in V:\home\localhost\www\forum\index.php on line 23

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in V:\home\localhost\www\forum\index.php on line 25

почему?

 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 23 Сентябрь 2010 - 21:59

tro9an, ваша одна и единственная ошибка в запросе к БД.
Вообщем ошибка:

supplied argument is not a valid MySQL result resource

Появляется тогда, когда вы пытаетесь работать с невалидным ресурсом, который возникает при неверном запросе к базе данных.
Ваш запрос ошибочен тем, что в качестве таблицы вы указали зарезервированное/ключевое слово for в терминологии mysql.
Чтобы в запросах можно было использовать подобного рода слова, их нужно помещать в обратные ковычки `for`
Ваш запрос должен иметь вид:
SELECT id,title FROM `for`

  • 0

#3 tro9an

tro9an
    Topic Starter
  • Пользователь
  • 34 сообщений
  • Репутация: 0

Отправлено 23 Сентябрь 2010 - 22:06

Тему попрошу не закрывать т.к могуть возникнуть ещё проблемы,да и не только у меня одного
  • 0

#4 tro9an

tro9an
    Topic Starter
  • Пользователь
  • 34 сообщений
  • Репутация: 0

Отправлено 26 Сентябрь 2010 - 14:35

Имеется дата в формате дд.мм.гггг (например 31.12.2009). Надо написать скрипт который будет вычислять сколько осталось дней, месяцев, лет до этой даты. И вывести в формате "До события остался 1 год 5 месяцев и 25 дней". (при желании можно вывести часы и минуты).


Дайте подсказку как написать, а то них*ра не получается!!!
  • 0

#5 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 26 Сентябрь 2010 - 16:15

tro9an, и так, лучше реализовать в виде отдельной функции:
1) Входные данные: дата события в формате дд.мм.гггг
2) Выходные данные: массив (года, месяцы, дни)
3) Нам нужно получить текущую дату: функция date()
4) Теперь у нас есть текущая дата и дата события. Нам нужно вычислить между ними разницу:
4.1) Сначала нам нужно разбить даты и по дням, месяцам и годам: функция explode()
4.2) Теперь нужно сосчитать сколько разница в месяцах между датами (считаем полные месяцы)
Полных месяцев = (Год события - Год текущий) * 12 + Месяцы события - (месяцы текущего + 1)
Единица на конце для того чтобы сосчитать количество именно полных месяцев, потому что текущая дата так и так будет с неполным месяцем.
4.3) Это мы сосчитаем сколько полных месяцев между датами - теперь нам надо получить сколько лет и месяцев между датами отдельно. Для этого нам нужно Полные месяцы разделить на 12 и получим сколько лет между датами, а остаток от деления - сколько месяцев.
4.4) Теперь нам нужно определиться с числами, сколько же дней в остатке. Для этого подойдет формула
Остаток дней = Остаток дней события (от начала месяца) + Остаток дней текущей даты (до конца месяца)
Для остатка дней события ничего учитывать не нужно, то есть тупо ставить дни. А вот для остатка дней текущей даты нам придётся учитывать: сколько дней в том или ином месяце, а для февраля месяца так же будет важно - високосный или нет текущий год.
5) Получили 3 отдельных переменных: разница лет, разница месяцев, разница дней. Учитываем что разница дней может и превышать 31 день.
6) Далее эти три переменные кладём в массив и возвращаем из функции.

Вот и весь алгоритм функции

Для вывода нам понадобится такой код:
<?php

// массив, возвращаемый из функции
// $difference_dates = array('years' => [годов], 'months' => [месяцев], 'days' => [дней]);

echo "До даты осталось: "
echo $difference_dates['years'] > 0 ? "годов - $difference_dates['years'] " : ""
echo $difference_dates['months'] > 0 ? "месяцев - $difference_dates['months'] " : ""
echo $difference_dates['days'] > 0 ? "дней - $difference_dates['days']" : ""

?>

  • 0

#6 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 26 Сентябрь 2010 - 22:18

Дайте подсказку как написать, а то них*ра не получается!!!

tro9an,
ниже спойлер. Если нужна именно "подсказка, как написать" читаем пост ZiTosS-а, а в мой пост не подсматриваем ;)

<html>
<body>
<?php

//задача: вывести информацию сколько лет/месяцев/дней/часов/минут/секунд осталось до наступления заданной даты

function plural_type($n) {
$t1 = $n % 10;
$t2 = $n % 100;
return ($t1 == 1 && $t2 != 11 ? 0 : ($t1 >= 2 && $t1 <= 4 && ($t2 < 10 || $t2 >= 20) ? 1 : 2));
}

function s_type($n, $_type) {
$type = array (
'years' => array('год', 'года', 'лет'),
'months' => array('месяц', 'месяца', 'месяцев'),
'days' => array('день', 'дня', 'дней'),
'hours' => array('час', 'часа', 'часов'),
'minutes' => array('минута', 'минуты', 'минут'),
'seconds' => array('секунда', 'секунды', 'секунд')
);
return " " . $n . " " . $type[$_type][plural_type($n)];
}

function delta($key_date)
{
$now = getdate();
$keyd = split ('[: /.-]', $key_date);
$y = $keyd[2] - $now['year'];
$mo = $keyd[1] - $now['mon'];
$d = $keyd[0] - $now['mday'];
$h = $keyd[3] - $now['hours'];
$mi = $keyd[4] - $now['minutes'];
$s = $keyd[5] - $now['seconds'];

if($s < 0) { $s+=60; $mi--; }
if($mi < 0) { $mi+=60; $h--; }
if($h < 0) { $h+=24; $d--; }
if($d < 0) { $d+= cal_days_in_month(CAL_GREGORIAN, ($keyd[1] == 1 ? 12 : $keyd[1]-1), $keyd[2]); $mo--; }
if($mo < 0) { $mo+=12; $y--; }

if ($y != 0) $str .= s_type($y,"years");
if ($mo != 0) $str .= s_type($mo,"months");
if ($d != 0) $str .= s_type($d,"days");
if ($h != 0) $str .= s_type($h,"hours");
if ($mi != 0) $str .= s_type($mi,"minutes");
$str .= s_type($s,"seconds");
return $str;
}

$tst_date = "1-10-2010 12:00:00";
echo "До полудня 1 октября 2010 осталось" . delta($tst_date);

?>
</body>
</html>

  • 0

#7 tro9an

tro9an
    Topic Starter
  • Пользователь
  • 34 сообщений
  • Репутация: 0

Отправлено 27 Сентябрь 2010 - 16:29

В чём трабла? при любом нажатии на кнопку пишет "Такой пользователь зарегестрирован! Выберите другой логин!", даже в том случае если такой логин в БД свободен, и главное всёравно регит!!!
<?php include("db.php");?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Untitled Document</title>

</head>



<body>

<?php

if (isset($_POST['submit'])){

if (!empty($_POST['login']) && !empty($_POST['email']) && !empty($_POST['sum'])){

$login=trim($_POST['login']);

$login=mysql_real_escape_string($login);

$email=trim($_POST['email']);

$email=mysql_real_escape_string($email);

$pass_t=trim($_POST['pass_t']);

$pass_t=mysql_real_escape_string($pass_t);

if ((!empty($_POST['pass']) && !empty($pass_t))and($pass_t==($_POST['pass']))) {

$pass_t=md5($pass_t);

$result=mysql_query("INSERT INTO user (login,email,pass) VALUES ('$login','$email','$pass_t')");
$res=mysql_query("SELECT login FROM user WHERE login='$login'");

if ((mysql_num_rows($res))>0) {exit("Такой пользователь зарегестрирован! Выберите другой логин!");}
else{

if ($result=='true'){echo "Регестрания прошла успешно!";}

else {

exit("Регестрация не удалась попробуйте снова!");

}

}

}

else {

echo "Поле с потверждением пароля заполнено не верно!";

}



}

else {

exit("Вы заполнили не все поля!");

header("Location: reg.php");

}

}

?>

</body>

</html>

З.Ы норм регестрация? ;)
  • 0

#8 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 27 Сентябрь 2010 - 16:52

Сильно не вникал, но так, с ходу, проблема в том, что сначала в базу записываются данные нового пользователя:
$result=mysql_query("INSERT INTO user (login,email,pass) VALUES ('$login','$email','$pass_t')");
а затем только идет запрос на выборку данных и проверку существования логина:
$res=mysql_query("SELECT login FROM user WHERE login='$login'");
if ((mysql_num_rows($res))>0) {exit("Такой пользователь зарегестрирован! Выберите другой логин!");}
Конечно же пользователь с таким логином будет найден - ведь строкой ранее его данные записали в базу ;)
Т.е., логично, что надо сделать наоборот - сначала проверить свободен ли такой логин, если не свободен, то выдать соответствующее сообщение, а если свободен, то только тогда занести в базу.
  • 0


#9 tro9an

tro9an
    Topic Starter
  • Пользователь
  • 34 сообщений
  • Репутация: 0

Отправлено 27 Сентябрь 2010 - 17:08

matroskin8, спс , тупанул я чёта ;)
  • 0

#10 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 27 Сентябрь 2010 - 17:32

Пожалуйста ;)
  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru