Оператор PHP if позволит мне добавлять элементы в базу данных, но не разрешит echo или alert в Javascript

#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, или способ, которым я это делаю, может быть неправильным. Это сводит меня с ума! Еще раз большое спасибо за вашу помощь!