#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. Хорошо, теперь ошибок нет… Случается, что он все еще не работает, но это потому, что он всегда возвращает недопустимый. Я думаю, это потому, что я забыл убрать тире из числа.