اجرا نشدن کد خطا در response

پرسیده شده
فعالیت 1005 روز پیش
دیده شده 357 بار
0

عرض سلام و ادب

تو این کد دیتای برگشتی از سرور رو به آبجکت جاوااسکریپتی تبدیل کردم و ازش استفاده کردم:

        success: function(response) {
            var returnDataToObj = JSON.parse(response);
            var folderRow = returnDataToObj["row"];
            var folderId = returnDataToObj["folderId"];
            if (folderRow == 1) {
                $('<li> <a href="?folder_id=' + folderId + '" class="folders-text">' + input.val() + '</a> <a href="?delete_folder=' + folderId + '" class="remove"><i class="entypo-trash"></i></a> </li>').appendTo('.folderList');
            } else {
                alert(response);
            }
        }

ولی یه مشکلی که داره چون دیتای برگشتی parse شده دیگه قسمت else کد اجرا نمیشه و خطای زیر رو میده:

Uncaught SyntaxError: Unexpected token F in JSON at position 0

 البته با روش زیر حل شد ولی مطمئنم که روش بهینه ای نیست

success: function(response) {
            var returnData = response;
            if (returnData.startsWith("Failed")) {
              alert(returnData);
              stop();
            } else {
              var returnDataToObj = JSON.parse(response);
              var folderRow = returnDataToObj["row"];
              var folderId = returnDataToObj["folderId"];
              if (folderRow == 1) {
                $('<li> <a href="?folder_id=' + folderId + '" class="folders-text">' + input.val() + '</a> <a href="?delete_folder=' + folderId + '" class="remove"><i class="entypo-trash"></i></a> </li>').appendTo('.folderList');
              }
            }

          }

تو این روش من به همه پیام های خطایی که تعریف کردم یه کلمه ‘Failed’ اضافه کردم و با تابع startsWith تعیین کردم که اگه رشته برگشتی از سرور با این کلمه شروع شد، اون رشته رو alert کن.در غیر اینصورت قسمت else رو اجرا کن، تو این روش باید همه ی پیام های خطای تعریفی رو با کلمه Failed شروع کنیم و مطمئنا این روش خوبی نیست.

ممنون میشم راهنمایی کنید.

فایل پیوست

پویا پارسایی
پویا پارسایی

6 مرداد 00

0
حذف شده

البته یه روش دیگه هم که پیدا کردم اینه که اول این تابع رو تعریف میکنیم:

function errorAndDie($errorMsg){
    echo json_encode(["error"=>$errorMsg]);
    die();
}

تو این تابع تعریف کردم که یه رشته ای رو بگیره و اون رشته رو به عنوان value به کلید error میدیم.

بعد اون آرایه رو به JSON تبدیل میکنیم.

بعد هر جایی که پیغام خطا داشتیم، از این تابع استفاده می کنیم، به طور مثال:

        if (!isset($_POST['folderName']) || strlen($_POST['folderName']) < 3) {
            errorAndDie("Folder Name must include at least 3 characters!");
            
        }

و در نهایت میریم تو ajax و در قسمت success اینجوری تعریف میکنیم:

          success: function(response) {
            var returnDataToObj = JSON.parse(response);
            for (var key in returnDataToObj) {
              if (key == "error") {
                alert(returnDataToObj["error"])
              }
            }

در این قسمت ابتدا پاسخ برگشتی از سرور رو که یک JSON هست رو تبدیل به یک آبجکت جاوااسکریپتی میکنیم و سپس با حلقه for، کلید رو میگیریم و میگیم که اگه کلید برابر با error بود، مقداری که درون کلید error هست رو alert کن.

ولی باز هم من فکر میکنم که این روش بهترین روش نیست. چون تو قسمت کدهای سمت سرورمون هرجایی که خطا داشتیم باید تابع errorAndDie رو صدا بزنیم. من فکر میکنم که باید روش خلاصه تری باشه.

فایل پیوست

پویا پارسایی

توسط

پویا پارسایی

6 مرداد 00

0
حذف شده

درود

محتوای خود Response رو قرار میدید تا ببینم اصلا داخل چی داره

فایل پیوست

امیر صالحی

توسط

امیر صالحی

6 مرداد 00

0
حذف شده

این تابع کوئریم به دیتابیسه:

function addFolders($folder_name){
    global $pdo;
    $current_user_id = getCurrentUserId();
    $sql = "INSERT INTO folders (name,user_id) VALUES (:folderName,:user_id)";
    $stmt = $pdo->prepare($sql);
    $stmt-> execute([":folderName"=>$folder_name,":user_id"=>$current_user_id]);
    $folderadded = json_encode(["folderId" => $pdo->lastInsertId(),"row"=>$stmt->rowCount()]);
    return $folderadded;
}   
    

 

این تابعی هست که واسه نمایش ارورهامه:

function errorAndDie($errorMsg){
    echo json_encode(["error"=>$errorMsg]);
    die();
}

 

اینم کدهای ajaxHandler:

if (!isAjaxRequest()) {
    
    errorAndDie("invalid Request!");
}

if (!isset($_POST['action']) || empty($_POST['action'])) {
    errorAndDie("invalid Action!");
}

switch ($_POST['action']) {
    case 'addNewFolder':
        if (!isset($_POST['folderName']) || strlen($_POST['folderName']) < 3) {
            errorAndDie("Folder Name must include at least 3 characters!");
            
        }
        echo addFolders($_POST['folderName']);


        break;



    default:
        errorAndDie("invalid Action!");
        break;
}

 

فایل پیوست

پویا پارسایی

توسط

پویا پارسایی

7 مرداد 00

0
حذف شده

برای اینکه بدونید فولدری که میخواستید insert شده میتونید با response یه خورده کار کنید، برای مثال

try {
     $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
    if ($e->getCode() == 1062) {
       return false;
    } else {
        throw $e;
    }
}
return json_encode(["folderId" => $pdo->lastInsertId(),"row"=>$stmt->rowCount()]);

زمانی که دارید داخل php کوئری رو میزنید همونجا چک کنید ببینید اجرا شده یا ن و بعد مثل کد بالا اگه به خطا خورده بود false رو برگردونید که راحت سمت جاوااسکریپت بشه به سادگی چکش کرد که آیا response که اومده false است؟

 

اگه response مساوی با false نبود شما میتونید به راحتی از response جیسونی که درست کردید استفاده کنید و اگه false بود میتونید یه alertی به کاربر نشون بدید

 

فایل پیوست

امیر صالحی

توسط

امیر صالحی

7 مرداد 00

0
حذف شده

تو این روش اگه کوئری درست اجرا بشه، بازم تو response جیسونی که شامل folderId و row هست، alert میشه

در صورتیکه من میخوام فقط در صورت بروز خطا alert داده بشه.

فایل پیوست

پویا پارسایی

توسط

پویا پارسایی

7 مرداد 00

حذف شده
مشکلی نیست جای return false میتونید همون json رو return کنید
امیر صالحی

7 مرداد 00