2014-04-05 3 views
0

배열의 값을 검증하는 스크립트에 문제가있어 유효성 검사 후 값이 이미 열에 있는지 확인한 다음 복제본이없는 경우 값은 데이터베이스에, 각각은 해당 컬럼에 추가되어야합니다.배열의 값이 이미 데이터베이스에 존재하는지 확인 + 배열을 데이터베이스에 추가

나는 많은 것을 시도해 본 결과 가장 가까운 것은 배열의 한 값이 이미 테이블의 1 열에 있는지 확인하는 것입니다. 스크립트는 1 개의 테이블 중 5 개의 열에 중복이 있는지 확인해야합니다.

내가 allready 기입 한 것입니다 :

foreach ($_POST['email'] as $value){ 

if(! filter_var($value, FILTER_VALIDATE_EMAIL)) 
{ 

    echo "</br>" . $value; 
    echo "</br> email invalid</br>"; 
} 
else { 

    try{ 
     $DB = new PDO("mysql:host=$host;dbname=$dbname", $user, $password); 
     //foreach($_POST['email'] as $value){ 
      //echo "</br> $value </br>"; 
     $query = "SELECT * FROM uitnodigen WHERE email = :email " ; 
     $stmt = $DB->prepare($query); 
     $stmt->bindParam(':email', $value); 
     $blaa = $stmt->rowCount(); 
     $stmt->execute(); 

       } 
       catch (PDOException $exception){ 
        printf($exception->getMessage()); 
       } 
       echo "</br> </br> $value </br></br>"; 
       echo " $blaa"; 
        if($stmt->rowCount() > 0) 
      { echo "email exists"; 

      } 
       else { 

     echo "</br>ok </br>"; 
     } 


//} 

}} 

그리고 나는이 내가 데이터베이스에 내 배열을 추가하는 방법을 생각 :

$columns= implode(",", array_keys($_POST['email'])); 
$value= implode(",", array_values($_POST['email'])); 
echo "</br>$columns</br>"; 
echo "</br> $value </br>"; 
/* 
foreach ($_POST['email'] as $value){*/ 
try{ 
    $DB = new PDO("mysql:host=$host;dbname=$dbname", $user, $password); 

$query="INSERT INTO `uitnodigen` (`0` , `1` , `2 `, `3 `, `4`) VALUES ($value)"; 
$stmt = $DB->prepare($query); 
$stmt->execute();} 
catch(PDOException $e){ 
      echo $e; 
     } 

나는 명확히하기 위해 더 많은 정보를 제공해야하는 경우 나에게 알리라고 생각해. 미리 감사드립니다.

Ryan의 답변 덕분에 배열 값을 데이터베이스에 추가 할 수 있었기 때문에 배열의 각 값의 유효성을 검사하기도했습니다. 배열의 값 중 하나가 전자 메일 주소가 아니면 데이터베이스에 삽입되지 않습니다. 그렇지 않으면 배열의 값이 데이터베이스에 삽입됩니다. 나머지 문제는 내가 테이블에서 중복을 확인하는 방법을 모른다. 테이블에는 5 개의 열이 있으며 배열의 각 값에 대해 테이블에 중복이 있는지 여부를 확인해야합니다. 임 솔루션을 찾으려면, 어떤 도움이나 올바른 방향으로 밀어 크게 주시면 감사하겠습니다. 내 코드 : $ i = 0; $ j = count ($ _ POST [ 'email']);

foreach ($_POST['email'] as $value){ 
    $i++; 
if(! filter_var($value, FILTER_VALIDATE_EMAIL)) 
{ 

    echo "<br />email invalid<br />"; 


} 
elseif($j==$i){ 
    $emailQueryValues = array( ':email0' => $_POST['email']['0'], 
           ':email1' => $_POST['email']['1'], 
           ':email2' => $_POST['email']['2'], 
           ':email3' => $_POST['email']['3'], 
           ':email4' => $_POST['email']['4']); 
    echo "email klopt</br>"; 
    $sql = 'insert into uitnodigen (`email0`, `email1`, `email2`, `email3`, `email4`) ' 
     .' values (:email0, :email1, :email2, :email3, :email4)'; 
try{ 
    $DB = new PDO("mysql:host=$host;dbname=$dbname", $user, $password); 
$query = $DB->prepare($sql); 
$query->execute($emailQueryValues); 
} 
catch(PDOException $e){ 
      echo $e->getMessage(); 
     } 
} 
} 
+0

Sidenote : '
'대신에 '
'을 많이 사용하십시오. –

+1

예, 고마워요! – Avuerro

+0

중복을 곧 확인하기 위해 코드를 추가하겠습니다 :-) 내가 추가하고 체크 한 후 다른 댓글을 게시 할 것입니다. 암호. 유용하다고 생각되면 나중에 대답을 수락하는 것을 잊지 마십시오. –

답변

0

이것은 귀하의 코드를 기반으로합니다.

최대 5 개의 이메일을 입력 할 수 있습니다. 이를 확인하고 개별 오류 메시지를 표시합니다. 양식에 중복 된 전자 메일이 입력되는 것을 방지합니다.

데이터베이스 쿼리는 입력 된 열 수만큼 생성됩니다.

배열 : $ emailDetails에는 개별 전자 메일에 대한 모든 정보가 들어 있습니다.

시험 : 나 strlen (내파 ($ _ POST [ '이메일'])을 입력 배열이 적어도 하나 개의 값을 가지는 것을 보장

테스트했다.. PHP 5.3.18 윈도우 XP

<?php // Q22885105 - example tested code. 
/* 
* this is an example of how to generate the query and the bind values... 
* 
* You will need to modify it for your use case. 
* 
* This script allows 5 'email' to be entered and stored 
*/ 

/* 
* Do we have some email input? -- do some validation 
*/ 
$badEmailCount = 0; // assume all the 'email' are correct 

$emailDetails = array(); // store email info in here 
         // use $emailDetails['isValid'][0] - to check if all ok! 
         // use $emailDetails['value'][0] - to get the value 
         // 
// let us make life easier for us all and ensure that there are always 5 'email'! 
    for($idx = 0; $idx < 5; $idx++) { 
     $emailDetails['isValid'][$idx] = TRUE; // must be true! 
     $emailDetails['value'][$idx] = ''; 
     $emailDetails['htmlId'][$idx] = "email_$idx"; 
     $emailDetails['colName'][$idx] = "email$idx"; 
     $emailDetails['error'][$idx] = ""; 

    } 

if (!empty($_POST['email']) && strlen(implode($_POST['email'])) >= 1) { // validate email input 

    for($idx = 0; $idx < 5; $idx++) { 

     if (!empty($_POST['email'][$idx])) { 
      $isBad = !filter_var($_POST['email'][$idx], FILTER_VALIDATE_EMAIL); 


      if ($isBad) { 
       $emailDetails['error'][$idx] = 'is bad email address'; 
      } 
      else { // duplicate check 
       foreach($_POST['email'] as $idxDup => $dupValue) { 
        $isBad = $idxDup !== $idx && $dupValue == $_POST['email'][$idx]; 

        if ($isBad) { 
         $emailDetails['error'][$idx] = 'is duplicated email address'; 
         break; 
        } 
       } 
      } 

      if ($isBad) { 
       $badEmailCount++; 
      } 

      $emailDetails['isValid'][$idx] = !$isBad; 
      $emailDetails['value'][$idx] = $_POST['email'][$idx]; 
     } 
    } 
} 
else { // do we have the form but is it empty? 
    if (!empty($_POST['email']) && strlen(implode($_POST['email'])) == 0) { 
     $emailDetails['isValid'][0] = false; 
     $emailDetails['error'][0] = 'one email address is needed'; 
     $badEmailCount++; 
    } 
} // end validation... 
?> 
<!-- generate HTML code for the email form --> 
<?php if (empty($_POST['goEmail']) || $badEmailCount > 0): // no input or has error - show the form... ?> 
<form action="" method="post" 
    <fieldset class="email"> 
     <legend>Email details please...</legend> 
     <?php for($idx = 0; $idx < 5; $idx++): ?> 

     <div style="margin: 2px;<?php echo !$emailDetails['isValid'][$idx] ? ' border: 2px solid red;' : '';?> "> 
      <label for id="<?php echo $emailDetails['htmlId'][$idx]?>"><?php echo $emailDetails['colName'][$idx]?></label> 

      <input type="text" name="email[]" id="<?php echo $emailDetails['htmlId'][$idx]?>" 
        value="<?php echo $emailDetails['value'][$idx] ?>"> 

      <?php echo !$emailDetails['isValid'][$idx] ? $emailDetails['error'][$idx] : ''; ?> 
     </div> 
     <?php endfor; ?> 
    </fieldset> 
    <input type="submit" name="goEmail" value="tell us your thoughts..."> 

</form> 
<?php endif; ?> 

<?php 
if (empty($_POST['goEmail']) || $badEmailCount > 0) { 
    exit; // leave the script now... 
} 

// continue processing the input data 

// database connection... 
$dsn = 'mysql:host=localhost;dbname=testmysql'; 
$username = 'test'; 
$password = 'test'; 
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', 
); 
$theDB = new PDO($dsn, $username, $password, $options); 

// make db/pdo throw an exception when it gets confused. 
$theDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
// ------------------ end of database connection -------- 


// get input form details... 
$emailQueryValues = array(); 

$sqlColumns = ''; 
$sqlBindings = ''; 

for($idx = 0; $idx < 5; $idx++) { 
    if (!empty($emailDetails['value'][$idx])) { 
     $sqlColumns .= '`'. $emailDetails['colName'][$idx] .'`,'; 
     $sqlBindings .= ':'. $emailDetails['colName'][$idx] .','; 

     $emailQueryValues[':'. $emailDetails['colName'][$idx]] = $emailDetails['value'][$idx]; 
    } 
} 
$sqlColumns = rtrim($sqlColumns, ', '); // lose trailing comma 
$sqlBindings = rtrim($sqlBindings, ', '); 


try { 
    $sql = "insert into uitnodigen ($sqlColumns) values ($sqlBindings)"; 
    $query = $theDB->prepare($sql); 
    $query->execute($emailQueryValues); 
    $lastId = $theDB->lastInsertId(); 
} 
catch (\Exception $e) { 
    echo 'drat! '. $e->getMessage(); 
    // throw $e; // re-raise the exception 
} 

// test it worked... 
$sql = 'select * from uitnodigen where id = :id'; 
$query = $theDB->prepare($sql); 
$query->execute(array(':id' => $lastId)); 
$resultSet = $query->fetchAll(); 
var_dump(current($resultSet)); 
?> 
+0

감사합니다. 제공 한 코드에 솔루션의 일부가있었습니다. 중복을 검사하는 경우에만 여전히 고민 중입니다. – Avuerro