У меня есть автозаполненная форма, которая работает совершенно нормально. Я оставляю свой ноутбук и возвращаюсь, и теперь он больше не работает.
Моя база данных называется wallettest
Моя таблица называется населением и имеет 4 столбца: Id, location, slug, Population.
У меня есть 3 файла: index.php, script.js и ajax_refresh.php.
Выполняя некоторое тестирование, похоже, что он не имеет доступа к моему ajax_refresh.php, который соединяет меня с моей базой данных. Поэтому оттуда я решил поместить мой файл ajax_refresh.php в файл index.php. Ну, теперь я подключен к моей базе данных, но получаю ошибки (я не понимаю, почему это не связывает меня в первую очередь, у меня был правильный синтаксис в моем файле:
js file:"$.ajax({ url: "ajax_refresh.php",
В любом случае, файл теперь выглядит так, и ошибка, которую я получаю, ниже:
index.php:
<?php // PDO connect ********* //CHECK TO SEE IF CONNECTION IS MADE $db = mysql_connect("localhost","root","butthead"); if ($db) { echo("- Connection to database successful -"); } else if (!$db) { die("Database connection failed miserably: " . mysql_error()); } function connect() { return new PDO('mysql:host=localhost;dbname=wallettest', 'root', 'butthead', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); } $pdo = connect(); $keyword = '%'.$_POST['keyword'].'%'; $sql = "SELECT * FROM population WHERE slug LIKE (:keyword) ORDER BY population DESC LIMIT 0, 10"; $query = $pdo->prepare($sql); $query->bindParam(':keyword', $keyword, PDO::PARAM_STR); $query->execute(); $list = $query->fetchAll(); foreach ($list as $rs) { // put in bold the written text $slug = str_replace($_POST['keyword'], '<b>'.$_POST['keyword'].'</b>', $rs['slug']); // add new option echo '<li onclick="set_item(\''.str_replace("'", "\'", $rs['slug']).'\')">'.$slug.'</li>'; } // END AJAX_REFRESH.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=utf-8" /> <title>Autocomplete using PHP/MySQL and jQuery</title> <link rel="stylesheet" href="css/style.css" /> <script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/script.js"></script> </head> <body> <div class="container"> <div class="header"> </div><!-- header --> <h1 class="main_title">Autocomplete using PHP/MySQL and jQuery</h1> <div class="content"> <form> <p>Table consists of : ID, Location, Slug, Population </p> <br><br> <div class="label_div">Search for a Slug : </div> <div class="input_container"> <input type="text" id="slug" onkeyup="autocomplet2()"> <ul id="list_id"></ul> </div> </form> <br><br><br><br> <p>List will be ordered from Highest population to lowest population (Top to bottom)</p> <br><br> </div><!-- content --> <div class="footer"> Powered by Jason's Fingers</a> </div><!-- footer --> </div><!-- container --> </body> </html>
в<?php // PDO connect ********* //CHECK TO SEE IF CONNECTION IS MADE $db = mysql_connect("localhost","root","butthead"); if ($db) { echo("- Connection to database successful -"); } else if (!$db) { die("Database connection failed miserably: " . mysql_error()); } function connect() { return new PDO('mysql:host=localhost;dbname=wallettest', 'root', 'butthead', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); } $pdo = connect(); $keyword = '%'.$_POST['keyword'].'%'; $sql = "SELECT * FROM population WHERE slug LIKE (:keyword) ORDER BY population DESC LIMIT 0, 10"; $query = $pdo->prepare($sql); $query->bindParam(':keyword', $keyword, PDO::PARAM_STR); $query->execute(); $list = $query->fetchAll(); foreach ($list as $rs) { // put in bold the written text $slug = str_replace($_POST['keyword'], '<b>'.$_POST['keyword'].'</b>', $rs['slug']); // add new option echo '<li onclick="set_item(\''.str_replace("'", "\'", $rs['slug']).'\')">'.$slug.'</li>'; } // END AJAX_REFRESH.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=utf-8" /> <title>Autocomplete using PHP/MySQL and jQuery</title> <link rel="stylesheet" href="css/style.css" /> <script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/script.js"></script> </head> <body> <div class="container"> <div class="header"> </div><!-- header --> <h1 class="main_title">Autocomplete using PHP/MySQL and jQuery</h1> <div class="content"> <form> <p>Table consists of : ID, Location, Slug, Population </p> <br><br> <div class="label_div">Search for a Slug : </div> <div class="input_container"> <input type="text" id="slug" onkeyup="autocomplet2()"> <ul id="list_id"></ul> </div> </form> <br><br><br><br> <p>List will be ordered from Highest population to lowest population (Top to bottom)</p> <br><br> </div><!-- content --> <div class="footer"> Powered by Jason's Fingers</a> </div><!-- footer --> </div><!-- container --> </body> </html>
script.js:
// autocomplete : this function will be executed every time we change the text function autocomplet2() { var min_length = 3; // min caracters to display the autocomplete var keyword = $('#slug').val(); if (keyword.length >= min_length) { $.ajax({ url: 'ajax_refresh.php', type: 'POST', data: {keyword:keyword}, success:function(data){ $('#list_id').show(); $('#list_id').html(data); } }); } else { $('#list_id').hide(); } } // set_item : this function will be executed when we select an item function set_item(item) { // Changes input to the full name on selecting $('#slug').val(item); // Hides list after selection from list $('#list_id').hide(); } function change()
Ошибка:
В вашем коде есть много чего смешного:
mysql_*
и PDO API. Вы можете удалить все условия, в которых вы используете mysql_connect()
поскольку никогда не используете соединение ( $db
), созданное там. Отсутствует атрибут имени из вашего элемента ввода:
<input type="text" id="slug" name="keyword" onkeyup="autocomplet2()">
Что порождает ошибку, эта строка в вашем PHP:
$keyword = '%'.$_POST['keyword'].'%';
Когда вы первоначально загружаете страницу, $keyword
переменной $keyword
не определено, потому что массив $_POST
не установлен. Способ, которым вы это предотвращаете, – проверить, был ли массив задан перед назначением значения переменной:
if(isset($_POST)) { $keyword = '%'.$_POST['keyword'].'%'; // other code relying on $keyword being set should go here }
Обратите внимание на комментарий в коде выше. Любой код, основанный на заданном ключевом слове, например запрос к базе данных, должен находиться внутри условного выражения. Нет смысла запускать этот код, если переменная не установлена.
Наконец, ваша организация кода начнет становиться трудной в управлении, когда вы решите расширить то, что у вас есть. Рассмотрим разделение PHP, HTML и JS друг от друга, чтобы упростить управление.