За последние 24 часа нас посетили 19993 программиста и 1369 роботов. Сейчас ищут 652 программиста ...

$myrow = mysql_fetch_array($result);

Тема в разделе "PHP для новичков", создана пользователем zolga7, 19 авг 2010.

  1. zolga7

    zolga7 Активный пользователь

    С нами с:
    19 авг 2010
    Сообщения:
    3
    Симпатии:
    0
    Помогите новичку делаю свой первый сайт на PHP. У меня выдает ошибку

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

    Код:
    Код (Text):
    1. <?php
    2. include ("blocks/bd.php");
    3. $result = mysql_query ("SELEST title,mate_d,mate_k,text FROM settings WHERE page='index'",$db);
    4. $myrow = mysql_fetch_array($result);
    5. ?>
    6.  
    7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    8. <html>
    9. <head>
    10. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    11. <meta name="description" content="<?php echo $myrow['mate_d']; ?>">
    12. <meta name="keywords" content="<?php echo $myrow['mate_k']; ?>">
    13. <title><?php echo $myrow['title']; ?></title>
    14. <link href="style.css" rel="stylesheet" type="text/css">
    15. </head>
    16.  
    17. <body>
    18. <table width="690" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="main_border">
    19. <? include ("blocks/header.php");?>
    20.   <tr>
    21.     <td><table width="690" border="0" cellspacing="0" cellpadding="0">
    22.       <tr>
    23.         <? include ("blocks/lefttd.php");?>
    24.         <td>
    25.         <?php echo $myrow['text']; ?>        
    26.         </td>
    27.       </tr>
    28.     </table></td>
    29.   </tr>
    30.   <? include ("blocks/footer.php");?>
    31. </table>
    32. </body>
    33. </html>
    Код БЗ:
    Код (Text):
    1. <?php
    2. $db = mysql_connect ("localhost","php","12345");
    3. mysql_select_db ("phpsite", $db);
    4. ?>
    Как избавится от ошибки?
     
  2. Leo

    Leo Активный пользователь

    С нами с:
    3 авг 2010
    Сообщения:
    4
    Симпатии:
    0
    Исправте SELEST на SELECT
    А вообще лучше писать так:

    Код (Text):
    1. $result = mysql_query ("SELECT title,mate_d,mate_k,text FROM settings WHERE page='index'",$db) or die(mysql_error());
     
  3. zolga7

    zolga7 Активный пользователь

    С нами с:
    19 авг 2010
    Сообщения:
    3
    Симпатии:
    0
    Спасибо большое все работает!
     
  4. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    хм, и никто не написал "попов детектед".
     
  5. Jordan

    Jordan Активный пользователь

    С нами с:
    22 апр 2011
    Сообщения:
    2
    Симпатии:
    0
    плиз помогите, выдает ошибку Parse error: syntax error, unexpected '[', expecting ',' or ';' in Z:\home\localhost\www\phpsite\index.php on line 34

    код:

    <?php
    $db = mysql_connect("localhost","php","12345");
    mysql_select_db("phpsite",$db);

    $result = mysql_query ("SELECT title,meta_d,meta_k,text FROM settings WHERE
    page='index'",$db)or die(mysql_error());

    $myrow = mysql_fetch_array($result);
    ?>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta name="description" content=" <?php echo $myrow['meta_d']; ?>">
    <meta name="keywords" content=" <?php echo $myrow['meta_k']; ?> ">

    <meta http-equiv="content-type" content="text/html; charset=windows-1250">
    <title><?php echo $myrow['title']; ?></title>
    <link href="style.css" rel="stylesheet" type="text/css">

    </head>

    <body>
    <table width="690" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="main_border">
    <!--подключаем шапку сайта-->
    <? include ("blocks/header.php"); ?>

    <tr>
    <td height="679"><table width="690" height="679" border="0" cellpadding="0" cellspacing="0">
    <tr> <!--подключаем левую часть сайта-->

    <? include("blocks/lefttd.php");?>
    <td valign="top">
    <?php echo myrow['text']; ?>
    </td>
    </tr>
    </table></td>
    </tr><!--подключаем нижнюю часть сайта-->
    <? include("blocks/footer.php");?>
    </table>
    </body>
    </html>
     
  6. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
  7. Jordan

    Jordan Активный пользователь

    С нами с:
    22 апр 2011
    Сообщения:
    2
    Симпатии:
    0
  8. Benjamin

    Benjamin Активный пользователь

    С нами с:
    23 янв 2009
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Тула
  9. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    более того, $myrow['text']
     
  10. Verico

    Verico Новичок

    С нами с:
    13 апр 2017
    Сообщения:
    39
    Симпатии:
    0
    Помогите с кодом
    Код (Text):
    1.  
    2. [php]бд
    3. <?php
    4. header('Content-type: text/html; charset=utf-8');
    5.   $db = mysql_connect('localhost');
    6.   mysql_select_db("user",$db);
    7. ?>[/php]
    8.  
    9.  
    10.  
    11.  
    12.  
    13. <?php
    14. header('Content-type: text/html; charset=utf-8');
    15.     if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
    16.     if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    17.  
    18. if (empty($login) or empty($password))
    19.   {
    20.     exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
    21.     }
    22.  
    23.     $login = stripslashes($login);
    24.     $login = htmlspecialchars($login);
    25. $password = stripslashes($password);
    26.     $password = htmlspecialchars($password);
    27.     $login = trim($login);
    28.     $password = trim($password);
    29.     include ("bd.php");// подклюяаемся к базе
    30.     $result = mysql_query("SELECT id FROM users WHERE login='$login'",$db);
    31.  
    32.     $myrow = mysql_fetch_array($result);
    33.  
    34.      if (!empty($myrow['id'])) {
    35.     exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин.");
    36.     }
    37. // если такого нет, то сохраняем данные
    38.     $result2 = mysql_query ("INSERT INTO users (login,password) VALUES('$login','$password')");
    39.     // Проверяем, есть ли ошибки
    40.     if ($result2=='TRUE')
    41.     {
    42.     echo "Вы успешно зарегистрированы! Теперь вы можете зайти на сайт. <a href='index.php'>Главная страница</a>";
    43.     }
    44. else {
    45.     echo "Ошибка! Вы не зарегистрированы.";
    46.     }
    47.     ?>

    Проблема:
    Warning: mysql_fetch_array() expects parameter 1 to be resource
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Это означает, что неправильный запрос был, база его отказалась обрабатывать. Выведи на экран, какой запрос получается, и разберись, что неправильно. Ещё ошибку выведи.mysql_error, если не ошибаюсь. А вообще, пахнет уроками какого-нибудь Попова.
    1. Расширение mysql устарело года 4 назад, надо использовать mysqli или PDO
    2. Бредовая подготовка данных. stripslashes была нужна, пока не были выпилены магические кавычки (такими древними версиями php, в которых они ещё есть, пользоваться для новых сайтов не следует). htmlspecialchars никакого отношения к защите от sql-инъекций, которые тут возможны, не имеет
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А еще код уязвим к SQL-инъекциям.
     
  13. Verico

    Verico Новичок

    С нами с:
    13 апр 2017
    Сообщения:
    39
    Симпатии:
    0
    Уже все исправил)
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Покажи ;)
     
  15. Verico

    Verico Новичок

    С нами с:
    13 апр 2017
    Сообщения:
    39
    Симпатии:
    0
    Упс, только заметил что ответил на ваше сообщение, а хотел ответить во-этому форумчанину: "mkramer"( просто тогда пришел с ДР друга, так в голове каша была, и почему-то меня потянуло к компу). Что касается кода, то ошибки по поводу полной работы его я исправил будучи при этом пьяненьким, а от на форме наверное залип и не заметил кому отвечаю... Прошу прощения, и прошу помочь мне в защите от sql инъекции, а то я не давно начал изучать php и в безопасности я пока вообще не шарю...(
     
  16. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
  17. Verico

    Verico Новичок

    С нами с:
    13 апр 2017
    Сообщения:
    39
    Симпатии:
    0
  18. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Используй PDO и подготовленные запросы. Это поможет существенно повысить безопасность.
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Мифы о PDO, универсальности и подготовленных запросах:
    1) PDO из коробки гарантирует безопасность через использование подготовленных запросов. МИФ. По умолчанию PDO не использует имеющийся движок адаптера, обеспечивающий работу с подготовленными запросами, а эмулирует их, выступая в роли кверибилдера, уязвимого к атакам через кодировку. Это мало кто знает, к сожалению. За это отвечает отдельный параметр
    Код (Text):
    1. PDO::ATTR_EMULATE_PREPARES
    2) Только PDO позволяет работать с подготовленными запросами, а MySQLi не имеет нативного инструментария для этого. МИФ. Активно распространяемый повсюду и, зачастую, являющийся главным аргументом для выбора между PDO и MySQLi на проектах, где даже не обдумывалась возможность и необходимость использования разных БД. MySQLi прекрасно умеет работать с подготовленными запросами, причем не эмулируя их, а нативно, юзая соответствующий механизм БД.

    3) Если юзаешь PDO, то автоматом решается проблема с переносом проекта на новую БД. МИФ. PDO предоставляет универсальный интерфейс, но если запрос написан под MySQL, и использует специфичные для него вещи, то на том же PostgreSQL запрос завалится. PDO абстрагируется от особенностей работы конкретного адаптера, но не от его языка. Да, да, есть всякие абстрактные кверибилдеры, но что-то изощренное на них собирать задолбаешься.

    4) Универсальность PDO добавляет гибкости приложению. МИФ. Суть в том, что если проект пилится человеком знающим, он знает и о тонкостях работы той или иной БД. И учитывает их при проектировании структуры БД, при написании запросов. И архитектурное решение, выгодное для одной БД может быть проигрышным или не рабочим для другой. В итоге мы либо все подводим под общий знаменатель, отрезая все не общие фичи, либо поддерживаем двойной(минимум) набор команд и, возможно, двойную(тоже как минимум) архитектуру. Так, например, ряд специфичных команд надо дублировать для разных БД через костыли типа "PDO::MYSQL_ATTR_INIT_COMMAND". И вот чот как-то универсальный переносимый код на PDO превращается в MySQL-специфичный код на костылях.

    Вывод: юзать PDO надо тогда и только тогда, когда его основная фича, то бишь мультидвижковость, изначально заложена в проект. Когда у тебя есть силы и время на поддержание работы сразу с несколькими БД (а их больше двух, ваш КО), и если ты уверен, что это обязательно пригодится и окупится. В противном случае - хрень это тормозная, состоящая из оверхедов чуть более чем вся, да заставляющая дергать движок базы через служебные запросы, а не напрямую, через API адаптера. Не более того. При этом, местами доходя до маразма. Так, например, чтобы указать кодировку соединения, нам надо...установить соединение, а потом, используя его, указать через служебный запрос его кодировку.
     
    Sergey_Tsarev и TeslaFeo нравится это.
  20. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    @Fell-x27, спасибо за ликбез :) Узнал много нового.
    А можно поподробнее? Что за уязвимость через кодировку?
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    На русском не нашел, но если с инглишем проблем нет, то вот и вот. Вкратце, если тебе пришло два левых символа в одной кодировке, а в базу они были переданы для сохранения в другой, как есть, без спецификации кодировки соединения, то, при сохранении с последующим чтением в той кодировке, в которой работает БД, эти два символа могут быть истолкованы уже как третий, наш любимый апостроф. Это называется "инъекция второго порядка". И это одна из причин, почему желателньо не доверять даже тем данным, которые вытащил из собственной БД. И, кроме прочего, это одна из причин, почему расширение _mysql считалось само по себе дырой в безопасности. Оно не умело указывать явно кодировку работы с базой.

    У _mysqli такой проблемы нет. Более того, _mysqli умеет общаться с БД напрямую, минуя сетевой протокол(если, конечно, используется драйвер mysqlnd). И у нее есть целый развесистый букет функций для управления БД тоже напрямую, а не через посылание служебных запросов текстом.
     
    #21 Fell-x27, 15 апр 2017
    Последнее редактирование: 15 апр 2017
    TeslaFeo и Sergey_Tsarev нравится это.
  22. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    @Fell-x27, спасибо. Дельные статьи. Даже никогда не слышал про такой способ взлома.