#javascript #php #mysql
#javascript #php #mysql
Вопрос:
Я был бы очень признателен за помощь в этом:
У меня есть панель поиска. Вы вводите свой интерес в строку поиска, и он добавляет этот интерес в базу данных. Если ваш интерес существует в базе данных (как у кого-то другого такой же интерес), он использует оператор if, чтобы сказать об этом.
Это мой PHP-файл:
<?php
error_reporting(E_ALL ^ E_NOTICE);//TO REMOVE THE ANNOYING KEYWORD ERRORS
function connect() {
return new PDO('mysql:host=localhost;dbname=mysite', 'username', 'pw', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
//GET THE USERS IP
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else{
$ip=$_SERVER['REMOTE_ADDR'];
}
$pdo = connect();
//OUTPUT THE SEARCHBAR SUGGESTIONS (OBTAIN SUGGESTIONS FROM DATABASE)
$testing = '%'.$_POST['keyword'].'%';
$sql = "SELECT * FROM interests WHERE interestName LIKE (:testing) ORDER BY id ASC LIMIT 0, 10";
$query = $pdo->prepare($sql);
$query->bindParam(':testing', $testing, PDO::PARAM_STR);
$query->execute();
$list = $query->fetchAll();
foreach ($list as $rs) {
$interestName = str_replace($_POST['keyword'], '<b>'.$_POST['keyword'].'</b>', $rs['interestName']);
$interestlist = '<li onclick="set_item(''.str_replace("'", "'", $rs['interestName']).'')">'.$interestName.'</li>';
if (strlen($_POST['keyword']) > 0){
echo $interestlist; //THIS IS THE SUGGESTION BAR OUTPUT WITH THE SUGGESTIONS
}
}
//EVERYTHING ABOVE THIS WORKS.. THIS IS THE ISSUE HOWEVER:
if(isset($_POST['counter'])=="counter"){
//INSERT THE INTEREST INTO THE DATABASE, WITH THE USER'S IP.
$interestid=$_POST['interestinput'];
$insertion = "INSERT INTO users (ipaddress, interest)
VALUES ('$ip', '$interestid')";
$pdo->query($insertion);
//INSERTION WORKS. NOW I WANT TO CHECK IF INTEREST EXISTS. IF IT DOES EXIST, PRINT 'Users exist!':
$item ="SELECT * FROM `users` WHERE interest LIKE '$interestid'";
$result = $pdo->query($item)->fetchAll();
$counted = count($result); //COUNT NUMBER OF RESULTS, THEN INSERT IT AS A TEST.
$insertion = "INSERT INTO users (ipaddress, interest)
VALUES ('$ip', '$counted')";
if (count($result) > 1) {
$pdo->query($insertion); //TEST IF IT WORKS -- THIS INSERTS THE TOTAL NUMBER OF SAME INTERESTS. IT WORKS!
//BUT..
echo ("Users exist!"); //THIS DOES NOTHING? <--------- THE ISSUE
echo "<script> alert('Test'); </script>"; //THIS ALSO DOES NOTHING (as a test)
}
}
?>
Вот сайт с JS, CSS и т. Д. чтобы помочь лучше понять это:
//THIS FUNCTION IS CALLED WHEN THE USER HITS ENTER:
function enterPressed(e, field) {
if (e.keyCode == 13) {
var tb = document.getElementById("searchbox");
if (field.value.length > 0) {
document.getElementById('searching').style.display='block';
document.getElementById('searchdisappear').style.display='none';
$.ajax({
type: 'POST',
url: './php/phprefresh.php',
data: {interestinput: field.value, counter: "counter"},
});
}
}
}
//THIS FUNCTION GIVES INTEREST SUGGESTIONS (PULLED FROM THE DATABASE):
function autocomplet() {
var workchecker = 0
var min_length = 1;
var keyword = $('#searchbox').val();
if (keyword.length == min_length) {
$.ajax({
url: './php/phprefresh.php',
type: 'POST',
data: {keyword:keyword},
success:function(data){
$('#interest_list_id').show();
$('#interest_list_id').html(data);
}
});
} else {
$('#interest_list_id').hide();
}
}
//THIS FUNCTION SETS THE SUGGESTION INTO THE SEARCH BOX WHEN CLICKED
function set_item(item) {
$('#searchbox').val(item);
$('#interest_list_id').hide();
}
/*Input*/
input.interestsearch {
margin: auto;
margin-top: 30px;
width: 540px;
height: 30px;
font-size: 22px;
display: block;
padding: 2px 2px 2px 8px;
outline: none;
}
.input_container {
padding: auto;
margin: auto;
margin-top: -10px;
width: 520px;
display: block;
outline: none;
font-size: 20px;
}
.input_container ul {
list-style: none;
border-radius: 15px;
padding: 5px;
color: black;
}
.input_container ul li:hover {
border: 1px solid black;
border-radius: 15px;
cursor: pointer;
width: 500px
}
<!DOCTYPE html>
<html lang = "en">
<head>
<title>Testsite</title>
<link rel="stylesheet" type="text/css" href="./css/main.css">
<script src ="./js/search.js"></script>
<script type="text/javascript" src="js/jquery.min.js"></script>
</head>
<body">
<!-- SEARCH BAR -->
<div id="searchdisappear" style="display:block;">
<center><h1> INTEREST SEARCH </h1></center>
<input class="interestsearch" id="searchbox" maxlength="200" type="text" title="Search for an interest" onkeyup="autocomplet();" autocomplete="off" onkeypress="enterPressed(event, searchbox);" placeholder="Search for an interest.."/>
<div class="input_container">
<ul id="interest_list_id"></ul>
</div>
</div>
<!-- CONNECTING PEOPLE WITH SAME INTEREST-->
<div id="searching" style="display:none;">
<center> <p>Finding people..</p></center>
</div>
</html>
Кажется, я не могу понять, почему это просто не работает. Если он может что-то добавить в базу данных, он также должен иметь возможность выполнять «alert», нет?
Я ценю любую помощь. Большое спасибо!
Комментарии:
1. Просто отредактировал это — была ошибка с моим исходным сообщением. Извинения! Проблема сохраняется: P
2. Пожалуйста, не тестируйте vs.
=== TRUE
если вам абсолютно не нужно знать , что это буквальное логическое значение true. Это почти полностью бессмысленно, поскольку эти функции предназначены для возврата логически истинных значений по умолчанию.3. Спасибо всем. Я включил дополнительные подробности в полный PHP JS, HTML, CSS сайта, чтобы, надеюсь, помочь отладить проблему, с которой я столкнулся. Я ценю любую помощь!
4. В вашем коде очень много ошибок, но проблема, о которой вы спрашиваете, связана с сравнением логического вывода isset() со строкой. Вам нужно научиться читать свой код, а затем его настраивать и отлаживать.
Ответ №1:
Возможно, это работает
if (count($result) > 1) {
if($pdo->query($insertion) === TRUE){ //inserts 'works' into the database as a test.
echo "<script> alert('Test'); </script>";
}
}
Ответ №2:
Другим способом получить больший контроль над связью с базой данных было бы разделить php и javascript, например:
PHP search.php , содержит связь с базой данных, отправку и получение информации в базу данных и из базы данных, возвращает либо false
или null
, если информация не найдена.
HTML search.html , содержит javascript, который отправляет информацию и получает информацию от search.php , если полученная информация является ложной или нулевой, выдайте предупреждение по часовой стрелке в части отправки, если связь с базой данных невозможна.
search.php
...code to communicate with the database...
if ($result) {
if ($pdo->query($insertion)){
return true;
} else { return false; }
} else { return false; }
search.html предполагая, что вы используете jquery, например:
<script>
$("#search-form").submit(function(event) {
event.preventDefault();
var search = $('#search-field');
$.post("search.php", {query: search})
.done(function(data) {
if (!data or data === '') {
alert("No results.");
}
alert("Search response: " data );
})
.fail(function(data) {
alert("Error: " data);
});
});
</script>
Таким образом, если база данных недоступна, вся ваша страница не прерывается, вы можете просто сообщить пользователю, что у них проблема или что результатов нет, плюс вы можете выдать оповещение по любой причине, которая вам нужна.
Комментарии:
1. Я действительно ценю ваш комментарий. Поскольку я только начал изучать php, мне довольно сложно попытаться понять. В любом случае, как только я лучше пойму, я уверен, что смогу правильно реализовать эту альтернативу. Еще раз спасибо.
2. Привет, Ануга, я включил дополнительные подробности в свой оригинальный пост с полным HTML, JS, PHP и CSS сайта, которые, я надеюсь, облегчат вам понимание проблемы, с которой я столкнулся. Был бы признателен, если бы вы могли взглянуть! Спасибо!
Ответ №3:
Итак, резюмируем:
echo "<script>alert('Test');</script>"; //This works
if (count($result) > 1) {
$pdo->query($insertion) === TRUE; // This works - APPARENTLY
echo "<script>alert('Test');</script>"; // This DOES NOT work
}
Единственная «странная» вещь — это сравнение ===, которое не нужно. С таким же успехом вы можете написать
$pdo->query($insertion);
но это не должно оказывать заметного влияния на выводимый скрипт.
Проверьте источник HTML, который получает вывод. Если $pdo->query
только он не выводит что-то, что мешает работе Javascript, например, другой <script>
тег, комментарий или какую-либо открытую цитату, этого не может быть.
Когда мне нужно сделать это таким образом, я обычно использую что-то вроде:
echo 'ALPHA';
if (count($result) > 1) {
echo 'BRAVO';
$pdo->query($insertion);
echo 'CHARLIE';
}
echo 'DELTA';
а затем проверьте, что появляется в источнике, если что-то происходит.
Обновить
Я подозреваю, что if
возвращает false, а внутренний код не выполняется. Вы думали, что он выполняется, потому что в базе данных есть следы вставки, но что, если это была предыдущая вставка? В таких случаях всегда вставляйте что-то, содержащее временную метку.
Обновление 2
Здесь у вас (другая) ошибка:
if (isset($_POST['counter']) == 'counter')
Похоже, это работает, потому что в PHP ‘counter’, являющийся непустой строкой, является целым числом со значением 1; и isset($_POST[‘counter’]), будучи установленным, эквивалентен целому числу со значением 1.
Но вы получите:
if (isset($_POST['counter']) == 'counter') {
// This is true
}
if (isset($_POST['counter']) == 'Noshabkeming') {
// This is true, too.
}
Теперь попробуйте с этим кодом:
// Just check that 'counter' key exists.
if (array_key_exists('counter', $_POST)) {
$result = $pdo->query($item)->fetchAll();
$counted = count($result);
echo "<script> alert('Count is {$counted}. Deal with it'); </script>";
}
echo "<script>alert('Did you see an alert?');</script>";
Кроме того, чтобы избавиться от «ошибок ключевых слов», напишите это:
"this is a string with a {$variable}..."
вместо
"this is a string with a $variable..."
Это также позволит вам написать
"this is a string with an {$array['key']}."
Комментарии:
1. Да, это проблема, с которой я столкнулся. Я также протестировал его так, как вы предложили, и он выводит альфа и дельта, но не Браво или Чарли. Это странно.
2. Ах, тогда это понятнее. $result пуст. Вы уверены, что запрос на вставку, который вы видите в базе данных, не является более старым?
3. уверен на 100%. Я протестировал вставку по-другому, чтобы быть уверенным. Он вставляет общее количество «интересов» и вставляет правильное число. Что-то, что может помочь, я использую JavaScript для установки style.display=’none’, когда вы вводите что-то в строке поиска и нажимаете enter. Он устанавливает в строке поиска значение «нет», а в тексте «Поиск интересов» значение «блокировать». Может ли это иметь какое-то отношение к этому? Я очень новичок в PHP, поэтому, если я плохо объясняю это, дайте мне знать! Я также ценю вашу помощь.
4. Тот факт, что он не записывает ‘Bravo’ или ‘Charlie’, означает, что он не выполняет этот
if
код . Таким образом, он не может выполнять запрос на вставку, который находится между контрольными точками Bravo и Charlie. Чтобы быть еще более уверенным, вы можете поместитьdie('Here I die!');
вместоecho('Bravo');
. Затем посмотрите, умирает ли он, или, как я подозреваю, нет.5. Чтобы помочь вам лучше понять проблему, я включил весь PHP, HTML, CSS и JS моего сайта в свой оригинальный пост, который, надеюсь, прольет свет на то, почему это происходит. Возможно, это как-то связано с моим JS, или способ, которым я это делаю, может быть неправильным. Это сводит меня с ума! Еще раз большое спасибо за вашу помощь!