получение фатальной ошибки при возвращаемом значении в ajax

#php #jquery

#php #jquery

Вопрос:

Я выполняю вызов ajax в jquery

 $.get("validate_isbn.php", {isbn: obj[16]},
                                        function(answer) 
                                        {                   
                                            console.log(answer);
                                            if (answer == "valid")
                                            {
                                                var checked1 = $(elements[index]).val();
                                                //$(elements[index]).val().append("<img src = 'pics/green_checkmark.png'>");    //doesn't work
                                                //elements.after("<img src = 'pics/green_checkmark.png'>");     //sets all the elements with this pic
                                                elements.eq(index).after("<img src='pics/green_checkmark.png' id='checkmark'>");
                                                var checked = $(elements[index]).val();
                                            }                                                                               
                                        });
  

который работал нормально. Я увидел в отладчике, что он правильно отправляет переменную isbn с номером isbn из массива obj. Моя проблема на стороне php. Когда я тестировал, у меня просто было echo кода «valid», и все работало нормально. Но теперь, когда я вставил реальный код, он перестал работать:

 <?php
//This algorithm is for ISBN 10
function is_isbn_10_valid($n){
$check = 0;
for ($i = 0; $i < 9; $i  ) 
{
    $check  = (10 - $i) * substr($n, $i, 1);    //starting at the leftmost digit, multiple each digit by a constant, starting at 10, add the total
}   
$t = substr($n, 9, 1); // tenth digit (aka checksum or check digit)
$check  = ($t == 'x' || $t == 'X') ? 10 : $t;       //now add the tenth digit
return $check % 11 == 0;
}

//The algorithm for ISBN 13 validation is as follows:
//Multiply each digit of teh isbn, starting at the left, with 1,3,3... etc for the entire isbn (including the check digit becuase its 
//just going to be multiplied by 1 anyways.
//Add them all together, do mod 10 and voila!
function is_isbn_13_valid($n){
$check = 0;
for ($i = 0; $i < 13; $i =2) //this does digits 1,3,5,7,9,10,11,13
{
    $check  = substr($n, $i, 1);
}   
for ($i = 1; $i < 12; $i =2) //this does digits 2,4,6,8,10,12
{
    $check  = 3 * substr($n, $i, 1);
}   
return $check % 10 == 0;
}
$isbn = $_GET["isbn"];
if (strlen($isbn) = 10)
{
$result = is_isbn_10_valid($isbn);
}
else if (strlen($isbn) = 13) 
{
$result = is_isbn_13_valid($isbn);
}
else
{
$result false;
}
if ($result === true)
{echo "valid";}
else if ($result === false)
{echo "not valid";}
?>
  

(Примечание: я уверен, что могу быть более эффективным и просто возвращать логическое значение, но я воздержался от этого на данный момент, так как я не был уверен, как jquery .get воспримет это, как логическое значение или текст …)
В любом случае, это не работает. Ошибка на консоли.журнал выдает мне:

Неустранимая ошибка: не удается использовать возвращаемое значение функции в контексте записи…путь here…validate_isbn.php в строке 31

Комментарии:

1. Предполагая, что строка 31 означает во внешнем php-файле, который я вызываю, это строка «if ($ strlen($ isbn) = 10)»

2. Из любопытства… по какой-либо причине вы не можете выполнить проверку ISBN в JS? Похоже, что это тяжелый метод для выполнения полного ajax-запроса, когда точно такая же логика может быть легко реализована в JS.

Ответ №1:

В строке 31 у вас есть это:

 if ($strlen($isbn) = 10)
  

Удалите $ в функции strlen и измените = (оператор присваивания) на == (оператор эквивалентности). Теперь это должно выглядеть так:

 if (strlen($isbn) == 10)
  

Вам нужно будет сделать то же самое через несколько строк после этого.

Редактировать: еще одна вещь. Примерно в пяти строках снизу вам не хватает знака равенства.

 $result false;
  

Должно быть:

 $result = false;
  

Комментарии:

1. Верно, но только одна половина решения. Можете ли вы определить другую половину?

2. Я тоже отредактировал его, но все равно получаю ту же ошибку … и я сохранил свои изменения. Имеет ли это какой-либо смысл?

3. Ну, я думаю, вы все еще упускаете из виду один знак равенства (=), который должен быть двойным знаком равенства (==). Есть две строки, в которых вам нужно его изменить (я думаю, 31 и 37). В одной из последних строк есть еще одна проблема. Я несколько раз редактировал свой ответ, поэтому извините за путаницу. Перечитайте мой ответ для всех изменений, на которые я указал.

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