Joan M Ответов: 2

Ajax, jquery, PHP, mysql и удаленные функции PHP


Всем привет,

Разрабатывая небольшое приложение для отслеживания времени, я слишком часто использую comboboxes... Я только что узнал, что пользовательский интерфейс может использовать jquery для обработки текстовых вводов с автозаполнением...

Таким образом, все становится проще, когда у вас есть много данных для фильтрации.

Это говорит о том, что после образцов в Интернете у меня все работает нормально... У меня есть текстовый ввод, который предлагает варианты на выбор, как только вы начинаете писать.

У меня есть файл интерфейса вспомогательной базы данных (database.php) где у меня есть все функции базы данных, даже небольшой скрипт connect to database (getConn() , который возвращает указатель на соединение с базой данных).

В основном PHP файле у меня есть:
<script>
			$(function()
			{
				$("#edCustomer").autocomplete(
				{
					source: "autoCustomer.php"
				});
			});
		</script>


И в autoCustomer.php:
<?php
include('127.0.0.1/rt/database.php'
$DB = getConn();  // getConn is a function declared inside database.php...

	$term = $_GET['term'];
	$arr = array();

	$sql = "SELECT * FROM tCustomers WHERE name LIKE '%".$term."%' ORDER BY name ASC";
	$result = $DB->query($sql);

	if ($result != 0)
	{
		while ($row = $result->fetch_assoc())
		{
			array_push($arr, $row["name"]);
		}
		mysqli_free_result($result);

		echo json_encode($arr);
	}?>


Если я вставлю функцию getConn (функция getConn(){и все содержимое функции}) в autoCustomer.php файл, он работает отлично, но когда я пытаюсь использовать функцию getConn из удаленного файла, она терпит неудачу, возвращая ошибку 500 (Внутренняя ошибка сервера).

Как я могу включить в него database.php файл в этом файле autoCustomer.php-что?

Я пытался:
include_once($_SERVER['DOCUMENT_ROOT'].'/globals.php');
include($rootpath.'/rt/database.php');

$rootpath - это переменная, которая обновляется в globals.php-да.

Кроме того, для упрощения я попробовал:
include('127.0.0.1/rt/database.php');


В обоих случаях не повезло...

Есть идеи?

Что я уже пробовал:

Попытался использовать другой синтаксис для части include... ни с одним не повезло.

Richard Deeming

$sql = "SELECT * FROM tCustomers WHERE name LIKE '%".$term."%' ORDER BY name ASC";

Не делай этого так!

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

PHP: SQL-инъекция - руководство пользователя[^]

Joan M

Спасибо тебе, Ричард!

Учитывая то, что я прочитал в ссылках, которые вы предоставили... простое использование mysqli_real_escape_string должно избежать этой проблемы... Это правда?

Спасибо еще раз... Я действительно получаю удовольствие от этого маленького проекта... :D ничего общего с роботами и машинами, которые я обычно программирую... ^^

Richard Deeming

Это может иметь дело с очевидными случаями, но все еще могут быть крайние случаи, которые пройдут.

Как говорится в документе PHP, используйте его только в качестве запасного варианта, если вы работаете с базой данных, которая не поддерживает параметры. MySQL, безусловно, поддерживает параметры, поэтому вы должны их использовать. :)

РНР: Подготовленные инструкции и хранимые процедуры - руководство пользователя[^]

Joan M

Ооооок! Я определенно могу сказать, что сегодня многому научился...

Не использовал хранимую процедуру с 1999 года! :Д:Д:Д:Д

Очень приятно это знать... теперь я закончу приложение (я почти там), и как только я закончу его, я обновлю все запросы, чтобы быть в безопасности.

СПАСИБО!

Richard Deeming

Вам не нужно использовать хранимые процедуры для использования параметров. :)

Joan M

Лол! хорошо, я перечитаю его (дважды) и обязательно перенесу в параметры, а потом... thx!

2 Ответов

Рейтинг:
18

phil.o

Я бы попробовал require '127.0.0.1/rt/database.php';, при условии, что '127.0.0.1' - это каталог внутри текущего каталога файла.
require произойдет немедленный сбой, если файл не будет найден.
require и include ожидайте путь к файловой системе относительно текущего каталога файла, а не полный путь от веб-корня; возможно, это ваша проблема.

Надеюсь, это поможет.


Joan M

Попробовал... и с этим тоже не повезло...

Спасибо за Ваш быстрый ответ phil.o! :thumbsup:

phil.o

Вы пробовали использовать относительный путь из текущего каталога файла?

Joan M

Не было... теперь у меня есть... и это сработало!

БОЛЬШОЕ СПАСИБО!

phil.o

Всегда пожалуйста!

Рейтинг:
0

Patrice T

$sql = "SELECT * FROM tCustomers WHERE name LIKE '%".$term."%' ORDER BY name ASC";

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]