?id=id_user как правильно написать ajax запрос?

228
01 марта 2017, 22:20

Файл index.php

<?php
include_once("bd.php");
$resultat = mysql_query("SELECT * FROM users WHERE id='$_GET[id]'");
$array = mysql_fetch_array($resultat);
?>

Для каждого пользователя в конце свой id ( example.com?id=1 )

<div id="button"></div>
</div>
<script src="js/button.js"></script>

Файл time.php

Подключение к базе данных, где идет выбор данных по id и соответствующие данные вставляются в кнопку

<?php
include_once("bd.php");
$resultat = mysql_query("SELECT * FROM users WHERE id='$_GET[id]'");
$array = mysql_fetch_array($resultat);
?>

Функция вставки самой кнопки

<?php
do{
echo "<a style='display:".$array['active1']."; ' class='button' 
href='".$array['url1']."'   target='_blank'>".$array['url_name1']."</a>";
}
while($array = mysql_fetch_array($result));
?>

Файл JS

Получаю параметр страницы из самой ссылки ( example.com?id=... )

function getUrlVars() {             
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
    vars[key] = value;
});
return vars;
}
var id_user = getUrlVars()["id"];
function show(){
$.ajax({
url: "time.php",
data: 'id=id_user',
cache: false,
success: function(html){
$("#button").html(html);
  }
 });
}
$(document).ready(function(){
show();
setInterval('show()',1000);
});

Файл time.php тоже идет для каждого пользователя свой ( time.php?id=... ), как сделать запрос, что при входе на страницу( index.php?id=15 ) посылался запрос на файл time.php с такими же параметрами ( time.php?id=15 ).

Сейчас запрос посылается коряво ( time.php?id=id_user&_=1488322194611 ) , а должен посылаться вот так ( time.php?id= число равное id файла index ) за 3 дня обрыл весь гугл и ничего не смог найти похожего. Помогите пожалуйста, буду очень благодарен!

Answer 1

Во-первых, прочтите следующий комментарий: http://ru.stackoverflow.com/a/633878/238901. Он во многом актуален и для вашего примера: встраивание необработанных пользовательских данных в текст запроса (огромная дыра в безопасности) и использование устаревшего провайдера данных (mysql_* вместо mysqli_* или pdo_*).

Во-вторых, чтобы передать данные в запросе, используйте следующий синтаксис:

$.ajax({
  url: "time.php",
  data: {
    id: id_user,
    name: name_user // Просто в качестве примера
  },
  cache: false,
  success: function(html){
    $("#button").html(html);
  }
});

В-третьих, я порекомендовал бы переписать SQL-запрос следующим образом:

SELECT 
  active1, 
  url1, 
  url_name1  
  /* Добавьте другие поля, если необходимо*/ 
FROM users 
WHERE id=? 
LIMIT 1;

Речь, разумеется, не о разбиении на строчки, а о том, чтобы не использовать *, а всегда указывать все необходимые поля явным образом. Кроме того, ограничение LIMIT 1 даст вам гарантию, что запрос всегда вернет не больше одной записи, даже если с условием что-то не так (в вашем изначальном примере, если в GET придет '0 OR TRUE', из базы будет выгружена вся таблица целиком).

Наконец, в-четвертых, выполнение запроса лучше начинать с prepare:

if ($stmt = mysqli_prepare($link, $query)) {
  /* связываем параметры с метками */
  mysqli_stmt_bind_param($stmt, "s", $user_id);
  /* запускаем запрос */
  mysqli_stmt_execute($stmt);
  /* связываем переменные с результатами запроса */
  mysqli_stmt_bind_result($stmt, $active1, $url1, $url_name1);
  /* получаем значения */
  mysqli_stmt_fetch($stmt);
  /* закрываем запрос */
  mysqli_stmt_close($stmt);
}

Это преследует две цели: защита от SQL-инъекций и более эффективное выполнение запросов за счет возможности кеширования планов выполнения на стороне СУБД.

Answer 2

Спасибо, Igor.

Решил вопрос таким методом

data: 'id='+id_user,
READ ALSO
Взаимодействие ссылок и указателей

Взаимодействие ссылок и указателей

Если в функцию, принимающую int&, передать *p, где p - указатель на int, то функция будет работать с исходными данными, находящимися по этому адресу,...

199
Константы для максимальных значений

Константы для максимальных значений

Какая константа в STD определяет максимальное значение для типа std::uint64_t и для других подобных типов? Или использовать хедер <climits> ?

207
Ошибка в цикле, удаляющем пробелы

Ошибка в цикле, удаляющем пробелы

Есть код, который выявляет, является ли фраза или слово палиндромом, есть такой код

252
Реализация функции at для char C++

Реализация функции at для char C++

Помогите ,пожалуйста, реализовать близкую реализацию функции at()У меня существует класс для хранения массива типа char и мне нужно реализовать...

291