2017-03-22 5 views
2

私は妻のためにCRMを構築しており、私たちのビジネスに利用しています。いくつかの目標を念頭に置いてページを作成しました。ここでGOTO機能を乱用していますか?

  • データベースに新しいエントリを作成できるようにしてください。
  • データベース内の既存のエントリを表示できます。
  • データベース内の既存のエントリを更新できること。

私はもともといくつかのPHPファイルを持っていましたが、GOTO関数を使って、同じページにとどまっている間に何が起こっているのかに応じて実行する必要があるさまざまな部分にコードを送り出しました。

私の質問は、それほど目障りではありませんが、このようにすることに没落していますか?将来的に私はそれを行うための他のよりきれいな方法を検討します(提案は歓迎です)。しかし、これは私のために今働いています。私はプロジェクトに移り、 CRM。これをベータ版と考えてください。私がすでにやったことに大きな欠点があるなら、Idは今それに取り組んでいますが、これが少なくとも軽度に合理的であれば、私は前進します。

<?php 
// Include Connection Credentials 
include("../../comm/com.php"); 

//Connection to Database 
$link = mysqli_connect($servername, $username, $password, $dbname); 

// Connection Error Check 
if ($link->connect_errno) { 
    echo "Sorry, there seems to be a connection issue."; 
    exit; 
} 

// Define Empty Temporary Client ID 
$new_client_id =""; 

// Define Empty Success Message 
$successful =""; 

// Define Empty Error Messages 
$firstnameErr =""; 
$lastnameErr =""; 
$addressErr =""; 
$cityErr =""; 
$stateErr ="" ; 
$zipcodeErr =""; 
$phoneErr =""; 
$emailErr =""; 

// CHECK FOR SEARCH PROCESS 
if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (isset($_POST['searched'])) { 
     $client_id = $_POST['client_id']; 
     $buttontxt = "Update"; 
     goto SearchReturnProcess; 
    } 
} 

// Retrieve Client ID 
if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (empty($_POST['client_id'])) { 
     $buttontxt = "Create Client"; 
     goto CreatNewClientProcess; 
    } else { 
     $client_id = $_POST['client_id']; 
     $buttontxt = "Update"; 
     goto UpdateClientProcess; 
    } 
} 

// CONTINUE FOR NEW CLIENT 
CreatNewClientProcess: 

// Check For Missing Fields and report 
if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (empty($_POST["firstname"])) { 
     $firstnameErr = "First name is a required field - please make entry below"; 
     goto FinishUpProcess; 
    } 
    if (empty($_POST["lastname"])) { 
     $lastnameErr = "Last name is a required field - please make entry below"; 
     goto FinishUpProcess; 
    } 
    if (empty($_POST["email"])) { 
     $emailErr = "Email is a required field - please make entry below"; 
     goto FinishUpProcess; 
    } 
    if (empty($_POST["phone"])) { 
     $phoneErr = "Phone is a required field - please make entry below"; 
     goto FinishUpProcess; 
    } 
    if (empty($_POST["address"])) { 
     $addressErr = "Address is a required field - please make entry below"; 
     goto FinishUpProcess; 
    } 
    if (empty($_POST["city"])) { 
     $cityErr = "City is a required field - please make entry below"; 
     goto FinishUpProcess; 
    } 
    if (empty($_POST["state"])) { 
     $stateErr = "State/Province is a required field - please make entry below"; 
     goto FinishUpProcess; 
    } 
    if (empty($_POST["zipcode"])) { 
     $zipcodeErr = "Postal code is a required field - please make entry below"; 
     goto FinishUpProcess; 
    } 
} 

// Prepared Statement For Database Search 
if ($stmt = $link->prepare("INSERT INTO client (firstname, lastname, address, city, state, zipcode, phone, email) VALUES (?,?,?,?,?,?,?,?)")){ 

// Bind Search Variable 
$stmt->bind_param('ssssssss', $firstname, $lastname, $address, $city, $state, $zipcode, $phone, $email); 

// Define Form Field Input 
$firstname = $_POST['firstname']; 
$lastname = $_POST['lastname']; 
$address = $_POST['address']; 
$city = $_POST['city']; 
$state = $_POST['state']; 
$zipcode = $_POST['zipcode']; 
$phone = $_POST['phone']; 
$email = $_POST['email']; 

// Execute the Statement 
$stmt->execute(); 
} 

// Close Statment 
$stmt->close(); 

// Report Successful Entry 
$successful = "Client Successfully Created!"; 

// Define New Client ID 
$new_client_id = $link->insert_id; 

// FINISH NEW CLIENT PROCESS 
goto FinishUpProcess; 



// CONTINUE FOR SEARCHED PROCESS 
SearchReturnProcess: 

// Prepared Statement For Database Search 
$stmt = $link->prepare("SELECT firstname, lastname, address, city, state, zipcode, phone, email FROM client WHERE client_id=?"); 

// Bind Client ID into Statement 
$stmt->bind_param('s', $client_id); 

// Execute the Statement 
$stmt->execute(); 

// Bind Variables to Prepared Statement 
$stmt->bind_result($firstname, $lastname, $address, $city, $state, $zipcode, $phone, $email); 

//fetch value 
$stmt->fetch(); 

// Close Statment 
$stmt->close(); 

// FINISH SEARCHED PROCESS 
goto FinishUpProcess; 



// CONTINUE FOR UPDATE CLIENT PROCESS 
UpdateClientProcess: 

// Prepared Statement For Database Search 
if ($stmt = $link->prepare("UPDATE client SET firstname=?, lastname=?, address=?, city=?, state=?, zipcode=?, phone=?, email=? WHERE client_id=?")){ 

// Bind Search Variable 
$stmt->bind_param('sssssssss', $firstname, $lastname, $address, $city, $state, $zipcode, $phone, $email, $client_id); 

// Define Form Field Input 
$firstname = $_POST['firstname']; 
$lastname = $_POST['lastname']; 
$address = $_POST['address']; 
$city = $_POST['city']; 
$state = $_POST['state']; 
$zipcode = $_POST['zipcode']; 
$phone = $_POST['phone']; 
$email = $_POST['email']; 
$client_id = $_POST['client_id']; 

// Execute the Statement 
$stmt->execute(); 
} 

// Close Statment 
$stmt->close(); 

// Report Successful Update 
$successful = "Client Updated Successfully!"; 

// FINISH UPDATE PROCESS 
goto FinishUpProcess; 



// CONTINUE FOR FINISHING UP PROCESS 
FinishUpProcess: 

// Disconnect from Database 
mysqli_close($link) 
?> 


<!DOCTYPE html> 
<html> 
<head> 
<title>Client Information</title> 
<link rel="stylesheet" href="styles.css"> 
</head> 

<body> 

<div class="container"> 

<form id="contact" action="" method="post"> 

<h4>enter client info below</h4> 
<font color="red"><?php echo $successful; ?></font> 

<fieldset> 
<input name="client_id" value="<?php if (empty($_POST['client_id'])) { echo $new_client_id; } else { echo $_POST['client_id']; } ?>" type="hidden"> 
</fieldset> 

<fieldset> 
<font color="red"><?php echo $firstnameErr; ?></font> 
<input name="firstname" value="<?php if (isset($_POST['client_id'])) { echo $firstname; } else { echo $_POST['firstname']; } ?>" placeholder="First Name" type="text" tabindex="1" autofocus> 
</fieldset> 

<fieldset> 
<font color="red"><?php echo $lastnameErr; ?></font> 
<input name="lastname" value="<?php if (isset($_POST['client_id'])) { echo $lastname; } else { echo $_POST['lastname']; } ?>" placeholder="Last Name" type="text" tabindex="2"> 
</fieldset> 

<fieldset> 
<font color="red"><?php echo $emailErr; ?></font> 
<input name="email" value="<?php if (isset($_POST['client_id'])) { echo $email; } else { echo $_POST['email']; } ?>" placeholder="Email Address" type="email" tabindex="3"> 
</fieldset> 

<fieldset> 
<input name="mailinglist" id="checkbox" type="checkbox" checked> 
<label>add to the mailing list</label> 
</fieldset> 

<fieldset> 
<font color="red"><?php echo $phoneErr; ?></font> 
<input name="phone" value="<?php if (isset($_POST['client_id'])) { echo $phone; } else { echo $_POST['phone']; } ?>" placeholder="Phone Number" type="tel" tabindex="4"> 
</fieldset> 

<fieldset> 
<font color="red"><?php echo $addressErr; ?></font> 
<input name="address" value="<?php if (isset($_POST['client_id'])) { echo $address; } else { echo $_POST['address']; } ?>" placeholder="Street Address" type="text" tabindex="5"> 
</fieldset> 

<fieldset> 
<font color="red"><?php echo $cityErr; ?></font> 
<input name="city" value="<?php if (isset($_POST['client_id'])) { echo $city; } else { echo $_POST['city']; } ?>" placeholder="City" type="text" tabindex="6"> 
</fieldset> 

<fieldset> 
<font color="red"><?php echo $stateErr; ?></font> 
<input name="state" value="<?php if (isset($_POST['client_id'])) { echo $state; } else { echo $_POST['state']; } ?>" placeholder="State/Province" type="text" tabindex="7"> 
</fieldset> 

<fieldset> 
<font color="red"><?php echo $zipcodeErr; ?></font> 
<input name="zipcode" value="<?php if (isset($_POST['client_id'])) { echo $zipcode; } else { echo $_POST['zipcode']; } ?>" placeholder="Postal Code" type="text" tabindex="8"> 
</fieldset> 

<fieldset> 
<font color="red"><?php echo $countryErr; ?></font> 
<input name="country" value="<?php if (isset($_POST['client_id'])) { echo $country; } else { echo $_POST['country']; } ?>" placeholder="Country" type="text" tabindex="9"> 
</fieldset> 


<fieldset> 
<input name="vegan" type="checkbox"> 
<label>Vegan or Vegitarian</label> 
</fieldset> 

<fieldset> 
<input name="smoker" type="checkbox"> 
<label>Smoker</label> 
</fieldset> 

<fieldset> 
<textarea name="client_notes" placeholder="general notes" tabindex="10"></textarea> 
</fieldset> 

<fieldset> 
<button name="submit" type="submit" data-submit="...Sending"><?php echo $buttontxt; ?></button> 
</fieldset> 


</form> 
</div> 

</body> 

</html> 
+8

ようなものです:) –

+3

GOTOとsertainlyを使用する理由は絶対にありませんこの状況でいいえ – RiggsFolly

+0

古い、しかしまだ読む価値がある:http://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf –

答えて

1

はい。

私は異端と冒涜について説くことはしませんが、あなたのGOTOのほとんどが単に間違っていることを示します。

  1. UpdateClientProcessこれは、作成の入力のみを検証する必要があるという考えは非常に奇妙です。作成と更新の両方で常に同じにする必要があります。これは無用で有害です。
  2. 検証ルーチンからのFinishUpProcessです。使いやすさの点ではひどいです。被害者の頭が落ちた蛇口の下で固定された時、古いチニーズの拷問があった。最初は無害で、人々は時を過ぎて狂ってしまった。あなたはあなたの検証をしています。なぜ、すべてのフィールドをチェックして、一度にエラーを表示するのではなく、すぐにユーザーに伝えるのはなぜですか?
  3. FinishUpProcessがデータを保存していません。これは、HTTPプロトコルルールに違反し、POST要求を処理した後、サーバは、GETメソッドを使用してクライアントをリダイレクトするLocationヘッダーを発行する必要があると言います。それ以外の場合、クライアントがページを更新すると、そのレコードは複製されます。
  4. これは面倒です。あなたはそれを言った。単調な構造のため、コードを見直して見直すのは苦労しました。コード埋め込みは、意図的に発明されました。例えば、Pythonでは、を強制的ににして、下位コードブロックを区別するためにパディングを使用します。

このコードのための適切な構造は、一部の人々は、あなたがそれを使用している場合、あなたはそれを乱用していると言うかもしれない

$errors = []; 
if ($_POST) { 
    if (empty($_POST["firstname"])) { 
     $errors['firstname'] = "First name is a required field - please make entry below"; 
    } 
    // and so on 

    if (!$errors) { 
     if (empty($_POST['client_id'])) { 
      // go for insert 
     } else { 
      // go for update 
     } 
     header("Location: ."); 
     exit; 
    } 
    $firstname = htmlspecialchars($_POST['firstname']); 
    // and so on 
} 
if (!$errors) { 
    if (!empty($_GET['client_id'])) { 
     // search your data from a GET variable 
    } else { 
     // define empty variables 
    } 
} 
?> 
<html goes here> 
+0

これは理にかなっています。病気はそれと一緒に描画ボードに戻ります。あなたの3番目の点については、私は100%を意味するものを理解していないかわかりません。それは、ページを完全に残すことなく、あるいはおそらくPHPの問題を終わらせてコマンドを出すことなく可能ではないようです。それについての情報を明確にしたり指示したりしても構いませんか?また、パディングの欠如に関しては、パディングを使用していないことが嫌いです。現時点では作業中のコード編集ソフトウェアを持っていないので、私は怠け者になっています。ホストWebサイトのFileManagerを直接使っています。非常に多くのスペースバーのタップ! – inkslinger

+0

最後に発行することは可能ですが、コードが複雑になるので、なぜ必要なのでしょうか?そして、パディングに関しては、間違ったエディタであるだけでなく、構造自体もフラットであり、フォローするのが難しいです。 –

2

私は、私もgotoはPHPに存在していたことを知っていたかわからない。ここで

は私が持っているものです。私は過去数年にわたって私の分け前を使っていましたが、最近はそうしていません。修正点:

1 - あなたのgotosの多く(例:SearchReturnProcess)を関数呼び出しに置き換えることができます。ラベルで始まり(そしてgotoを使って)コードの塊を作るのではなく、同じ名前の別の関数をfunction SearchReturnProcess()にしてそこにコードを入れてください。

2 - エラー処理のために、ifelseifを使用します。

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (empty($_POST["firstname"])) { 
     $firstnameErr = "First name is a required field - please make entry below"; 
    } elseif (empty($_POST["lastname"])) { 
     $lastnameErr = "Last name is a required field - please make entry below"; 
    } elseif... 

など その後、あなたはステートメントのセットは、「エラーなし」のコードのブロックが続くelseで終わらせる、またはどちらか複数の別々のエラーの代わりに、エラー表示を処理し、各フィールドの隣ではなく1つの場所に単にエラーを表示するために、ブロックの後に1つの汎用エラー変数(たとえば$fieldErr)を作成し、ブロックの後にif ($fieldErr != '')のようなコードを付けることができます。

+0

これはすべて非常に便利です。私がここで開発しているものを再編集するとき、私はこれをすべて考慮に入れます。ありがとうございました。 – inkslinger

関連する問題