как использовать fetch для публикации данных на php - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь создать функцию комментария для моего приложения на нативном скрипте, используя ссылку на мой brwser, эта функция работает нормально. но используя API выборки в моем приложении, он возвращает функцию ошибки (сообщение об ошибке - неожиданный токен <в JSON в позиции 0) </p>

function AddCommentViewModel() {
      const viewModel = observableModule.fromObject({});
      var comm = "nice guy";
      var email = appSettings.getString("email");
      var phone = appSettings.getString("number");
        alert(comm);
        alert(email);
        alert(phone);
        var url = "https://adekunletestprojects.000webhostapp.com/skog/addComment.php?email" + email + "&number=" + phone + "&comment=" + comm;
        fetch(url).then((response) => response.json()).then((res) => {
    viewModel.set("itemsd", res.itemss);
            alert("successful");
     }).catch((err) => {
            alert("failed");
    });
      return viewModel;
    }

my php равно

<?php 

include 'config.php';
$number = $_GET['number'];
$comment = $_GET['comment'];
$email = $_GET['email'];
try {
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    $sql = "SELECT name FROM searchResults WHERE email='$email'";
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $dbh->prepare($sql);  
    //$stmt->bindParam(":email", $_GET['email']);
    $stmt->execute();
    $employees = $stmt->fetch(PDO::FETCH_ASSOC);
    $employees1 = $stmt->fetchAll(PDO::FETCH_OBJ);
    $name = $employees['name'];
    $sql1 = "INSERT INTO comments (number, comment, user, date) VALUES ('$number', '$comment', '$name', '02/04/2020')";
    $sth = $dbh->query($sql1);
    $sth->execute();
    $dbh = null; 
    echo '{"itemss":'. json_encode($employees1) .'}';
    //$conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
} catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
}

?>

1 Ответ

1 голос
/ 18 апреля 2020

Ошибка Unexpected token < in JSON at position 0 скорее всего означает, что вы получили HTML вместо JSON. (Представьте, что парсинг <html>..... как JSON - тогда первый символ <, который недопустим JSON.)

Вы можете временно использовать response.text() вместо response.json(), а затем распечатать res вы получили, так что вы можете увидеть фактическое содержимое, прежде чем вам не удастся проанализировать их как JSON. (В идеале вы должны использовать прокси-сервер отладки, чтобы увидеть, что происходит на самом деле, или просто использовать DevTools и посмотреть на вкладку сети!)

Я бы предположил, что ваш сервер показывает ошибку, и это выглядит как HTML.

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

var url = "https://adekunletestprojects.000webhostapp.com/skog/addComment.php?email" + email + "&number=" + phone + "&comment=" + comm;

Код здесь есть "?email" + email, который сгенерирует что-то вроде ?emailjohn@doe.com, что, вероятно, не то, что вы хотите. Здесь вы пропускаете знак равенства: "?email=" + email

Но есть другая проблема: вы не кодируете значения. Что делать, если адрес электронной почты установлен на john&alice=bob@doe.com? Тогда у вас будет ?email=john&alice=bob@doe.com, что вам тоже не нужно. (Или представьте текст комментария , содержащий &, что более вероятно.)

Если бы это было в браузере или node.js, вам лучше использовать объект URL , но в NativeScript у вас этого нет. Таким образом, вы просто используете encodeURIComponent для кодирования каждого отдельного значения:

var url = "https://adekunletestprojects.000webhostapp.com/skog/addComment.php?email=" +
  encodeURIComponent(email) + "&number=" + encodeURIComponent(phone) + "&comment=" +
  encodeURIComponent(comm);

Или вы можете написать вспомогательную функцию, которая сделает это за вас, и получить более чистый код:

const buildQuery = params => Object.entries(params)
  .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
  .join('&')

// Later on:
const query = buildQuery({ email: email, number: phone, comment: comm })
const url = `https://adekunletestprojects.000webhostapp.com/skog/addComment.php?${query}`
...