1 Востаннє редагувалося Faraon (25.05.2017 14:23:52)

Тема: крос-доменні запити ajax (вирішено)

Привіт. На моєму сайті є форма яку юзер заповняє  і відправляє ajax-ом на інший сервер, і там дані повинні записатися в базу. Спочатку дані які юзер відправляв блокувалися:

XMLHttpRequest cannot load https://***/**/**.php. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://house-build.org' is therefore not allowed access.

добавив  в php файл:

header('content-type: application/json; charset=utf-8');
header("access-control-allow-origin: *");

помилка з консолі зникла.  Зараз не можу вивести дані з бази, при тому що до бази підключається (виводиться при успішному підключенні "ок"), і сам sql запит робочий тому що був скопіпащений з іншої моєї сторінки де все працює.

        $.ajax({
          type: "POST",
          url: "https://site/formSend/sendData.php",
          dataType: 'text',
          //crossDomain: true,
          data: "quest_email="+$('[name="quest_email"]').val()+"&brand="+$('#select2-chosen-1').html()+"&partNumber="+
          $('[name="partNumber"]').val()+"&quantity="+$('[name="quantity"]').val()+"&note="+$('[name="note"]').val()+"&identification="+$('[name="identification"]').val(),

          success: function(data){
            document.write(data);
            $('#formSendRequest').html("<div style='width: 100%; padding: 50px; margin: 10px 0px; color: #156902; border: border:  2px dotted black;'>Ваше сообщение было успешно отправлено.</>");
            //$("#send_button").removeAttr('disabled');//повертаємо стан кнопки в активний
          },
          
        error: function(response) {
            console.log(JSON.stringify(response));
        }
      
        });

файл.PHP

<?php 
header('content-type: application/json; charset=utf-8');
header("access-control-allow-origin: *");
$host = "..";
$loginBd = "..";
$passwordBd = "....";
$nameBd = "..";
$link = mysqli_connect("$host", "$loginBd", "$passwordBd", "$nameBd");
mysqli_set_charset($link, "utf8");
/* проверяем соединение */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}else{
    //echo "ok";
}
if(isset($_POST['brand']) )//&& $_SERVER['HTTP_HOST'] == "$host"
{
        $result = mysqli_query($link, "SELECT * FROM mf_manufacturer");
        while( $row = mysqli_fetch_assoc($result) ){ 
            echo "<option value='".$row['name']."' onclick='chekedBrand(`".$row['name']."`)' id='option'>".$row['name']."</option>";
        } 
        
    
}




?>

в консолі вибиває:

{"readyState":0,"responseText":"","status":0,"statusText":"error"}

2

Re: крос-доменні запити ajax (вирішено)

проблема в рядку:

echo "<option value='".$row['name']."' onclick='chekedBrand(`".$row['name']."`)' id='option'>".$row['name']."</option>";

якщо написати так:

            echo $row['name']."  "."<br>";

то все виводить.
Чому?

3 Востаннє редагувалося Faraon (25.05.2017 10:34:55)

Re: крос-доменні запити ajax (вирішено)

якщо вивести

 echo "-".$row['name']."  "."<br>";

-працює, а якщо спробувати вивести:

 echo "-------------------------------------".$row['name']."  "."<br>";

то ні...
(

4

Re: крос-доменні запити ajax (вирішено)

прочитав що ajax-ом не можна відправляти запити на домени які хоч якось відрізняються від того з якого відправляється, це стосується http та https, різних портів і тому подібне...
По ідеї запит доходить, але відповіді ми не отримаємо якщо домен не поверне з відповіддю.

header("access-control-allow-origin: *");

В мене він вертає хедер, але все одно відповідь доходить через раз, подумав і поняв що вона мені не дуже так і потрібна зараз, мені головне insert, а він працює добре.

5

Re: крос-доменні запити ajax (вирішено)

тільки в файлі  .htaccess пропишіть:
Header add Access-Control-Allow-Origin "*"
все працює, відповідь приходить. (відправляю методом  GET)

Подякували: NaharD, 0xDADA11C7, ostap34PHP, /KIT\4

6

Re: крос-доменні запити ajax (вирішено)

Якщо знаєш англійську то - https://enable-cors.org
Інакше шукай в гуглі шось типу - cors js

Подякували: 221VOLT, Faraon2

7

Re: крос-доменні запити ajax (вирішено)

Щоб просто записати дані на віддалений сервер, можна ще використати навіть такий трюк. Робимо "фальшивий" HTTP запит на зображення.

data = new Image();
data.src = "http://server/data?put1=data1&put2=data2";

І зловити GET параметри.

Можна ще зробити API на віддаленому сервері і робити ajax запит на "локальний" сервер, де твой в свою чергу зробить api запит до віддаленого.

Також є протокол JSONP, для зчитування даних через JS на віддаленому сервері.
https://uk.wikipedia.org/wiki/JSONP

Подякували: 0xDADA11C7, 221VOLT, Faraon3