2013-06-04 2 views
1

저는 PHP와 SQL에 매우 익숙합니다. 학교 과제를 위해 사용자가 고객 데이터를 업데이트 할 수있는 양식을 만들어야합니다. 그러나 업데이트 기능은 데이터 세트의 마지막 ID로 고객을 업데이트 만한다는 것을 알았습니다. 예를 들어 데이터 집합에 4 명의 고객이있는 경우 나는 고객 ID를 드롭 다운 목록으로 사용했습니다. id, 1 ~ 3을 선택하면 0 행이 업데이트됩니다. id, 4를 선택할 때만 작동합니다. 따라서 4 번째 버전 만 업데이트 할 수 있습니다. 누군가 내 코드를 살펴보고 문제가 무엇인지, 해결 방법을 알려 줄 수 있습니까? 고맙습니다!이 mysqli prepare 문을 어떻게 수정해야합니까?

<div> 
      <form method="post" action="updatecustomer.php"> 
       <fieldset> 
        <legend>Update Existing Customer</legend> 
        <li>Customer ID: 
         <select name="customer_id"> 
     <?php 
     if(!($stmt = $mysqli->prepare("SELECT customer_id, customer_id FROM customer"))){ 
      echo "Prepare failed: " . $stmt->errno . " " . $stmt->error; 
     } 

     if(!$stmt->execute()){ 
      echo "Execute failed: " . $mysqli->connect_errno . " " . $mysqli->connect_error; 
     } 
     if(!$stmt->bind_result($customer_id, $customer_id)){ 
      echo "Bind failed: " . $mysqli->connect_errno . " " . $mysqli->connect_error; 
     } 
     while($stmt->fetch()){ 
      echo '<option value=" '. $customer_id . ' "> ' . $customer_id . '</option>\n'; 
     } 
     $stmt->close(); 
     ?> 
         </select> 
        </li> 
        <li>First Name: <input type="text" name="fName"> Last Name: <input type="text" name="lName"</li> 
        <li>Email Address: <input type="text" name="email"></li> 
        <li>Phone Number: <input type="text" name="phone_number"></li> 
        <li>Street Number: <input type="text" name="address_no"> Street Line 1: <input type="text" name="address_street1"></li> 
        <li>Street Line 2 (Apt or Unit Number): <input type="text" name="address_street2"></li> 
        <li>City: <input type="text" name="address_city"> State: <input type="text" name="address_state"> Zip: <input type="text" name="address_zip"> </li> 
       </fieldset> 
       <input type="submit" name="update" value="Update Customer"> 
       <input type="submit" name="delete" value="Delete Customer"> 
     </div> 
+0

당신은 내가이 문제 의심 ... 질문에서 사용자 이름과 암호를 제거 –

+0

을 할 수 있습니다 만이 할 수있는 ' 'customer_id' 컬럼을 한 번만 가져오고'$ customer_id' 변수를 한 번만 바인딩 할 수 있도록 코드를 변경하려면 해를 끼치십시오 (:-)). – nurdglaw

+0

'bind_param()'메소드에서, 첫 번째 자리 표시자를 고객 ID로 바인딩합니다. 실제로는 forename입니다. 마지막에 customer_id를 바인드해야합니다. –

답변

0

$stmt->bind_param 라인의 변수의 순서를 확인하십시오

<?php 
//Turn on error reporting 
ini_set('display_errors', 'On'); 
//Connects to the database 
$mysqli = new mysql(SERVER_NAME, USERNAME,PASSWORD, DATABASE); 
if($mysqli->connect_errno){ 
    echo "Connection error " . $mysqli->connect_errno . " " . $mysqli->connect_error; 
} 


if(!($stmt = $mysqli->prepare("UPDATE customer SET fName=?, lName=?, email=?, phone_number=?, address_no=?, address_street1=?, 
    address_street2=?, address_city=?, address_state=?, address_zip=? WHERE customer_id = ?"))){ 
    echo "Prepare failed: " . $stmt->errno . " " . $stmt->error; 
} 

if(!($stmt->bind_param("isssiissssi",$_POST['customer_id'],$_POST['fName'],$_POST['lName'],$_POST['email'],$_POST['phone_number'], $_POST['address_no'], 
    $_POST['address_street1'],$_POST['address_street2'],$_POST['address_city'],$_POST['address_state'], $_POST['address_zip']))){ 
    echo "Bind failed: " . $stmt->errno . " " . $stmt->error; 
} 
if(!$stmt->execute()){ 
    echo "Execute failed: " . $stmt->errno . " " . $stmt->error; 
} else { 
    echo "Updated " . $stmt->affected_rows . " rows to customer."; 
} 

?> 

여기 내 양식의 코드의 일부입니다

다음은 "updatecustomer.php"코드입니다.

0

시험해보기 : bind_param() 방법으로 코드를 더 깔끔하게 이해하고 이해하기 쉽도록 고객 ID를 재정렬했습니다.

$stmt = $mysqli->prepare(" 
    UPDATE customer 
    SET fName=?, 
     lName=?, 
     email=?, 
     phone_number=?, 
     address_no=?, 
     address_street1=?, 
     address_street2=?, 
     address_city=?, 
     address_state=?, 
     address_zip=? 
    WHERE customer_id = ? 
"); 

if(!$stmt){ 
    echo "Prepare failed: " . $stmt->errno . " " . $stmt->error; 
} 

$paramBinding = $stmt->bind_param("sssiissssii", 
         $_POST['fName'], 
         $_POST['lName'], 
         $_POST['email'], 
         $_POST['phone_number'], 
         $_POST['address_no'], 
         $_POST['address_street1'], 
         $_POST['address_street2'], 
         $_POST['address_city'], 
         $_POST['address_state'], 
         $_POST['address_zip'], 
         $_POST['customer_id'] 
); 

if(!$paramBinding){ 
    echo "Bind failed: " . $stmt->errno . " " . $stmt->error; 
} 

편집 한 다음 옵션을 통해 반복 할 때 :

foreach($stmt->fetch() AS $row){ 
    echo '<option value="'. $row['customer_id'] . '"> ' . $row['customer_id'] . '</option>\n'; 
} 
+0

팁 주셔서 감사합니다. 코드를 변경했지만 ID # 1로만 고객을 업데이트 할 수 있습니다. ID # 2 또는 # 3을 선택하더라도 변경 사항은 ID # 1에만 반영됩니다. 문제가 무엇인지에 대해 더 자세히 알려주시겠습니까? – user2203774

+0

나는 한 가지 변경 만 한 코드를 업데이트했다.'isssiissssi'를'bind_param()'메소드의 첫 번째 매개 변수에서'sssiissssii '로 변경했다. 시도해 볼 수 있습니까? –

+0

나는 그것을 시도했지만, 내가 한 모든 변경 사항이 다른 ID #가 아닌 ID # 1에 왜 나타나는지 알 수 없다. – user2203774

관련 문제