2014-09-07 5 views
0

У меня не было формального обучения в кодировании и надеялся, если кто-нибудь скажет мне, должен ли я быть осторожным с моим кодом?Резервный Overkill?

// Insert info to the db 
if ($stmt = $db_connect->prepare("INSERT INTO db (col1, col2) VALUES (?, ?)")) { 
    if(!$stmt->execute([$val1, $val2])) { 
     exit("1:Faild to create deal"); 
    } 
    // Get last id 
    $id = (int)$db_connect->lastInsertId(); 
    $stmt->closeCursor(); 
} else { exit("0:Faild to create deal"); } 

// Create the folder 
if(!mkdir("folder/folder".$id)) { 
    if($stmt = $db_connect->prepare("DELETE FROM db WHERE id=?")) { 
     if(!$stmt->execute([$id])) { 
      exit("1:Faild to create the directory -> Faild to remove the row from the database"); 
     } 
     exit("Faild to create the directory"); 
    } 
    exit("0:Faild to create the directory -> Faild to remove the row from the database"); 
} 

Повторяю заявление о создании папки еще раз с тем же макетом. Это просто повторяемый код, который выглядит излишним.

Примечание: У пакета, который у меня есть с моим хостом, есть только таблицы MyISAM, поэтому я не могу использовать Rollback.

Если что-то не удается, я хочу отменить все, что прошло.

Может кто-нибудь, пожалуйста, дайте мне руководство для лучших практик или я это делаю правильно?

+0

ну, это поможет, если вы объясните в своем вопросе, что именно вы пытаетесь сделать. вы сначала вставляете строку в свой db - тогда вы проверяете, можете ли вы создать папку. и если вы не можете его создать, вы снова удалите ту же строку? почему бы вам не проверить, можете ли вы сначала создать папку, а если нет, вы даже не вставляете ничего в свой db? –

+0

Извините, я думал, что сделал. Это не то, что я делаю, это больше то, как я делаю это, что мне нужна помощь. Ваше предложение работает в обоих направлениях. Если я могу создать каталог, но потом не могу обновить базу данных, мне все равно придется удалить каталог – ChristopherStrydom

+0

. Мне следовало бы более четко понять, что если что-то не получается, я хочу отменить все, что прошло – ChristopherStrydom

ответ

1

Я реструктурировал и расширил ваш код, а также добавил немного простой обработки ошибок с использованием исключений. первых вы должны установить ошибку PDO обработки в режиме исключения:

$db_connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

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

/*** FUNCTIONS ***/ 
// insert info to the db 
function dbInsertInfo($db_connect, $val1, $val2) 
{ 
    $stmt = $db_connect->prepare("INSERT INTO db (col1, col2) VALUES (?, ?)"); 
    $stmt->execute([$val1, $val2])); 
} 
//------------------------------- 

// get the last insert id 
function dbGetId($db_connect) 
{ 
    $id = (int)$db_connect->lastInsertId(); 
    $stmt->closeCursor(); 
    return $id; 
} 
//------------------------------- 

// delete db-entry 
function dbDeleteId($db_connect, $id) 
{ 
    $stmt = $db_connect->prepare("DELETE FROM db WHERE id=?"); 
    $stmt->execute([$id]); 
} 
//------------------------------- 

// create the folder 
function createFolder($id) 
{ 
    if(!mkdir("folder/folder".$id)) throw new Exception("Failed to create the directory"); 
} 
//------------------------------- 

то здесь ваша процедура со всеми try{ } catch{ } секций для обработки ошибок исключениями:

/* PROCEDURE */ 

// 01 | try to insert into db 
try 
{ 
    dbInsertInfo($db_connect, $val1, $val2); 
} 
catch(PDOException $e) 
{ 
    //if exception thrown, do not continue the script: 
    echo "Unable to insert into DB: ".$e->getMessage(); 
    exit(); 
} 
//------------------------------- 

// 02 | try to get last insert id 
$id = false; 
try 
{ 
    $id = dbGetId($db_connect); 
} 
catch(PDOException $e) 
{ 
    //if exception thrown, do not continue the script: 
    echo "Unable to get last insert id from DB: ".$e->getMessage(); 
    exit(); 
} 
//------------------------------- 

// 03 | try to create folder // if it fails -> try to delete db entry 
try 
{ 
    createFolder($id); 
} 
catch(Exception $e) 
{ 
    // if exception caught, try to remove the corresponding DB entry: 
    echo $e->getMessage(); 
    echo "<br />"; 
    echo "trying to remove DB entry now"; 

    // try to delete db entry 
    try 
    { 
     dbDeleteId($db_connect, $id); 
    } 
    catch(PDOException $e) 
    { 
     //if exception thrown, do not continue the script: 
     echo "Unable to delete from DB: ".$e->getMessage(); 
     exit(); 
    } 
} 
//------------------------------- 
/* Everything worked fine if you get to this point of the code*/ 

может показаться вам сегодня техническим недостатком, но я думаю, что он гораздо более структурирован и лучше его прочитал, как только вы вошли в него. плюс, он делится только на 3 шага.

+0

может возникнуть проблема с '$ id = dbGetId();' находится внутри 'try {}' и, следовательно, недоступен в elswhere .. зависает. –

+0

ОК, похоже, это не имеет значения - но я обязательно обновлю ответ и сначала определю '$ id', чтобы убедиться. –

+0

Спасибо! Я никогда не использовал исключения раньше ... Думаю, я сделаю некоторые чтения по этому вопросу – ChristopherStrydom

 Смежные вопросы

  • Нет связанных вопросов^_^