Помощь по php, mysqli

RSST

Новичок
Здравствуйте пишу потихоньку движок на mysqli часто сталкиваюсь с ошибкой такой как

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given

можете помочь исправить этот файл
заранее спасибо
 

Вложения

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
За тебя дебажить твой код никто не будет. Так что вооружаемся гуглом, мануалом и ищем, почему же ты передаешь вместо нужного обьекта null.

PS: качать код никто не будет, другое дело если код выложен на pastebin или аналоги. Тут могут ткнуть сразу куда надо. Да и этот форум поддерживает вставку кода. Только не надо пихать сюда весь код...
 

RSST

Новичок
часть кода вся проблема в 5 запросах

if (isset($_GET['login']) && isset($_GET['password']))
{
# Проверяем существование аккавунта с этими данными
if (mysqli_result(mysqli_query($db,"SELECT COUNT(*) FROM `users` WHERE `login` = '". input($_GET['login']) ."' AND `password` = '". encrypt(input($_GET['password'])) ."' LIMIT 1"), 0) == 1)
{
# Массив с данными пользователя
$user = mysqli_fetch_assoc(mysqli_query($db,"SELECT * FROM `users` WHERE `login` = '". input($_GET['login']) ."' AND `password` = '". encrypt(input($_GET['password'])) ."' LIMIT 1"));

# Создаем ID в сессии
$_SESSION['user_id'] = $user['id'];

# Записываем дату последнего посещения
mysqli_query($db,"UPDATE `users` SET `date_last_entry` = '". time() ."' WHERE `id` = '$user[id]' LIMIT 1");

// проверка наличия настроек
if (mysqli_result(mysqli_query($db,"SELECT COUNT(*) FROM `user_settings` WHERE `user_id` = '$user[id]'"), 0) == 0) mysqli_query("INSERT INTO `user_settings` SET `user_id` = '$user[id]'");

# Массив с настройками
$settings = mysqli_fetch_assoc(mysqli_query($db,"SELECT * FROM `user_settings` WHERE `user_id` = '$user[id]' LIMIT 1"));
}
else $err .= 'Неверный логин или пароль<br />';
}
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
RSST
Код оформляется тэгами [ php ] [ / php ] без пробелов.

Что нам говорит решим отладки? Ошибки не вижу, чтобы ты включил к выводу. Ну и после проблемного места надо вывести http://php.net/manual/ru/mysqli.error.php

PS: $user[id] != $user['id']
 

Фанат

oncle terrible
Команда форума
Когда видишь такой код, хочется взять и что-нибудь поломать. Ногу там, или ухо.

Мало того, что чудовищный mysql_result пытаемся тащить за собой в mysqli
Мало того что инъекции
Но эти запросы!
Сначала заглядываем в кастрюлю, проверяем, есть ли там котлеты. и закрываем крышку.
Потом снова открываем, чтобы уже взять котлету. Теперь можно.
Удивительно, почему перед апдейтом проверки нету.

PHP:
$userid = $db->getOne("SELECT id FROM users WHERE login = ?s AND password = ?s", $_GET['login'], encrypt($_GET['password']);
if ($userid)
{
    $_SESSION['user_id'] = $userid;
    $db->query("UPDATE users SET date_last_entry = UNIX_TIMESTAMP() WHERE id = ?i", $userid);
    $settings = $db->getRow("SELECT * FROM user_settings WHERE user_id = ?i", $userid);
} else {
    $err .= 'Неверный логин или пароль';
}
ВСЁ

$db брать здесь: http://www.phpfaq.ru/safemysql
 

RSST

Новичок
Когда видишь такой код, хочется взять и что-нибудь поломать. Ногу там, или ухо.

Мало того, что чудовищный mysql_result пытаемся тащить за собой в mysqli
Мало того что инъекции
Но эти запросы!
Сначала заглядываем в кастрюлю, проверяем, есть ли там котлеты. и закрываем крышку.
Потом снова открываем, чтобы уже взять котлету. Теперь можно.

PHP:
$userid = $db->getOne("SELECT id FROM users WHERE login = ?s AND password = ?s", $_GET['login'], encrypt($_GET['password']);
if ($userid)
{
    $_SESSION['user_id'] = $userid;
    $db->query("UPDATE users SET date_last_entry = UNIX_TIMESTAMP() WHERE id = ?i", $userid);
    $settings = $db->getRow("SELECT * FROM user_settings WHERE user_id = ?i", $userid);
} else {
    $err .= 'Неверный логин или пароль';
}
ВСЁ

$db брать здесь: http://www.phpfaq.ru/safemysql

а какой стиль вы испозовали?
Объектный или процедурный?
и какой из них лучше использовать?
 

Фанат

oncle terrible
Команда форума
Это неважно на самом деле.
РНР - это всегда смешанный стиль, используется и то и другое.

Дело здесь не в стиле. А в том, что
Во-первых, нельзя писать такие паровозы из вложенных друг в друга функций. Если хочется обязательно в одну строчку - надо писать функцию-хелпер, а не вкладывать одно в другое 10 раз. Safemysql по ссылке - это класс, состоящий из таких хелперов-однострочников.
Во-вторых, надо защищаться от инъекций. Для этого любые динамические элементы должны попадать в запрос только через плейсхолдер. Safemysql по ссылке - это класс, который обеспечивает такую защиту.
 

Karat7

Новичок
Приветствую, скрипт стал выдавать ошибку: PHP Deprecated: Function eregi_replace() is deprecated я так понял что устарела функция eregi_replace().
Как её можно заменить в этом коде?

PHP:
<?

$border="0";        //// - чтобы убрать рамку поменяйте значение 1 на 0
$colortime="#6b3b24";  //// - цвет времени
$colornick="red";   //// - цвет ника
$bgcolor="#e1dbd4";   //// - цвет фона
$colormsg="#6b3b25";  //// - цвет сообщений чата
$width="615";       //// - ширина окна чата
$height="350";      //// - длина окна чата
$num="15";         //// - Кол-во сообщений после которого произойдет полная очистка чата
$msg2="1";        //// - 0 = показывать ссылки , 1 = удалять ссылки



$cook = $_COOKIE["chat_nick"]  ;
if($_POST)
{
    setcookie("chat_nick",$_POST["nick"]);
    header("Location: {$_SERVER['PHP_SELF']}");
    header("Location: {$_SERVER['HTTP_REFERER']}");  
}
?>
<script type="text/javascript">

function stopRKey(evt) {
  var evt = (evt) ? evt : ((event) ? event : null);
  var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
  if ((evt.keyCode == 13) && (node.type=="text"))  {return false;}
}

document.onkeypress = stopRKey;

</script>
<style>
.vid3 {
    display: inline-block;
    position: relative;
    font: bold 14px/38px Arial, Helvetica, sans-serif;
    text-align: center; padding-left: 20px;
    text-decoration: none;
    vertical-align: middle;
    cursor: pointer;
    color: #f1f1f1;
    text-shadow: 1px 2px 0 rgba(0, 0, 0, 0.15);
    border: 0;
    padding: 0 30px;
    background: #ffa400;
    background: -moz-linear-gradient(top, #ffa400 1%, #dc8400 100%);
    background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #ffa400), color-stop(100%, #dc8400));
    background: -webkit-linear-gradient(top, #ffa400 1%, #dc8400 100%);
    background: -o-linear-gradient(top, #ffa400 1%, #dc8400 100%);
    background: -ms-linear-gradient(top, #ffa400 1%, #dc8400 100%);
    background: linear-gradient(to bottom, #ffa400 1%, #dc8400 100%);
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa400', endColorstr='#dc8400', GradientType=0);
    -webkit-box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.15);
    -moz-box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.15);
    box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.15);
    z-index: 1;
}

.vid3:hover {
color: #eee;
top: 2px;
}
</style>
<?
$date=date("H:i:s");
$file_msg = fopen("msg.db","a+");
$file_msg_read = file("msg.db");

$count=count($file_msg_read);
if ($count>$num)
{
for ($i=($count-$num); $i<$count; $i++)
{
$str = $str.$file_msg_read[$i];
$str=ereg_replace("rn","n",$str);
}
$fp=fopen("msg.db","w");
fwrite($fp,$str);
}

$revers_file=array_reverse($file_msg_read);

echo ("<table border='$border' cellspacing=0 cellpadding=0>
<tr bgcolor='$bgcolor'>
<td><div style ='width:$width; height:$height; overflow-y:auto'>");


if(!$file_msg_read)
{
    echo("Нет сообщений");
}
else
{
    for($i=0; $i < count($revers_file); $i++)
{
    printf("<font color='$colormsg'>%s", $revers_file[$i]);
}
}
echo ('<br><center>');

echo("<tr><td><br>

<center><form name=formtext action=chat.php method=POST >
    <input type=text name=nick value=$cook><br>
    <input type=text name=msg  value=Сообщение  onblur=if(this.value=='')this.value='Сообщение' onfocus=if(this.value=='Сообщение')this.value='' ><br>
</center>
<center>
    <input id='mybutton' class='vid3'  style=width:139px type=submit value=Отправить disabled=true  >
    <input type=button class='vid3' style=width:139px value=Смайлы onClick=window.open('smiles/smiles.html','','width=300,height=80,status=no,menubar=no,toolbar=no,scrollbars=yes') onfocus=if(msg.value=='Сообщение')msg.value=''  >
</center>
</form>

<script>

var c=10; // Задержка в секундах
   fc();

   function fc(){

     if(c>0){

        document.getElementById('mybutton').value = 'Ждите ' + c;
        c=c-1;
        setTimeout('fc()', 1000);
      } else {
        document.getElementById('mybutton').disabled = false;
        document.getElementById('mybutton').value = ' Отправить ';
     }

       }

</script> </table>");



$nick=$_POST["nick"];
$msg=$_POST["msg"];

$nick = strip_tags($nick);
$msg = strip_tags($msg);


if($msg=="Сообщение")
{
echo('<p>фигня</p>');
}
else
{
if(!empty($msg)&&!empty($nick))
{
if($msg2==1)
{
$msg = eregi_replace("[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*","" ,$msg);
$msg = eregi_replace("^http://([^ ,\r\n]*)","", $msg);
$msg = eregi_replace("([ \r\n])http://([^ ,\r\n]*)","",$msg);
$msg = eregi_replace("([ \r\n])www\\.([^ ,\r\n]*)","",$msg);
$msg = eregi_replace("^www\\.([^ ,\r\n]*)","",$msg);
$msg = eregi_replace("-1-","<img src=smiles/1.gif>",$msg);
$msg = eregi_replace("-2-","<img src=smiles/2.gif>",$msg);
$msg = eregi_replace("-3-","<img src=smiles/3.gif>",$msg);
$msg = eregi_replace("-4-","<img src=smiles/4.gif>",$msg);
$msg = eregi_replace("-5-","<img src=smiles/5.gif>",$msg);
$msg = eregi_replace("-6-","<img src=smiles/6.gif>",$msg);
$msg = eregi_replace("-7-","<img src=smiles/7.gif>",$msg);
$msg = eregi_replace("-8-","<img src=smiles/8.gif>",$msg);
$msg = eregi_replace("-9-","<img src=smiles/9.gif>",$msg);
$msg = eregi_replace("-10-","<img src=smiles/10.gif>",$msg);
$msg = eregi_replace("-11-","<img src=smiles/11.gif>",$msg);
$msg = eregi_replace("-12-","<img src=smiles/12.gif>",$msg);
$msg = eregi_replace("-13-","<img src=smiles/13.gif>",$msg);
$msg = eregi_replace("-14-","<img src=smiles/14.gif>",$msg);
$msg = eregi_replace("-15-","<img src=smiles/15.gif>",$msg);
$msg = eregi_replace("-16-","<img src=smiles/16.gif>",$msg);
$msg = eregi_replace("-17-","<img src=smiles/17.gif>",$msg);
$msg = eregi_replace("-18-","<img src=smiles/18.gif>",$msg);

fwrite($file_msg,("<font color=$colortime> ($date) <font color=$colornick><br> $nick: </font></font>$msg<br><hr>\r\n"));
fclose($file_msg);
}
else
{
$msg = eregi_replace("[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*","<a href=\"mailto:\\0\" target=_blank>\\0</a>",$msg);
$msg = eregi_replace("^http://([^ ,\r\n]*)","<a href='http://\\1' target=_blank>http://\\1</a>", $msg);
$msg = eregi_replace("([ \r\n])http://([^ ,\r\n]*)","\\1<a href='http://\\2' target=_blank>http://\\2</a>",$msg);
$msg = eregi_replace("([ \r\n])www\\.([^ ,\r\n]*)","\\1<a href='http://www.\\2'target=_blank>http://www.\\2</a>",$msg);
$msg = eregi_replace("^www\\.([^ ,\r\n]*)","<a href='http://www.\\1' target=_blank>http://www.\\1</a>",$msg);
$msg = eregi_replace("-1-","<img src=smiles/1.gif>",$msg);
$msg = eregi_replace("-2-","<img src=smiles/2.gif>",$msg);
$msg = eregi_replace("-3-","<img src=smiles/3.gif>",$msg);
$msg = eregi_replace("-4-","<img src=smiles/4.gif>",$msg);
$msg = eregi_replace("-5-","<img src=smiles/5.gif>",$msg);
$msg = eregi_replace("-6-","<img src=smiles/6.gif>",$msg);
$msg = eregi_replace("-7-","<img src=smiles/7.gif>",$msg);
$msg = eregi_replace("-8-","<img src=smiles/8.gif>",$msg);
$msg = eregi_replace("-9-","<img src=smiles/9.gif>",$msg);
$msg = eregi_replace("-10-","<img src=smiles/10.gif>",$msg);
$msg = eregi_replace("-11-","<img src=smiles/11.gif>",$msg);
$msg = eregi_replace("-12-","<img src=smiles/12.gif>",$msg);
$msg = eregi_replace("-13-","<img src=smiles/13.gif>",$msg);
$msg = eregi_replace("-14-","<img src=smiles/14.gif>",$msg);
$msg = eregi_replace("-15-","<img src=smiles/15.gif>",$msg);
$msg = eregi_replace("-16-","<img src=smiles/16.gif>",$msg);
$msg = eregi_replace("-17-","<img src=smiles/17.gif>",$msg);
$msg = eregi_replace("-18-","<img src=smiles/18.gif>",$msg);
fwrite($file_msg,("<font color=$colortime> ($date) <font color=$colornick><br> $nick: </font></font>$msg<br><hr>\r\n"));
fclose($file_msg);
}}}
echo($result);

?>
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
В этом коде ее надо менять на str_replace в большинстве случаев и не мучать регулярки.

PS: Задавать свои вопросы надо в отдельной теме.
 

Karat7

Новичок
В этом коде ее надо менять на str_replace в большинстве случаев и не мучать регулярки.

PS: Задавать свои вопросы надо в отдельной теме.
Спасибо вам большое. Заменил все строки авто заменой eregi_replace на вашу и теперь работает как часы :)

P.S. Через некоторое время увидел лог файл на хостинге с такой ошибкой:
PHP Notice: Undefined index: nick in chat.php on line 138

Теперь что-то другое не нравится)

Линия 138: $nick=$_POST["nick"];
Линия: 139: $msg=$_POST["msg"];
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Karat7, надо заменять не ВСЕ строчки а только нужные, где нет намерения использовать регулярки
 
Сверху