2012-10-05 2 views
1

내 양식에 4 개의 텍스트 필드가 있어야 데이터베이스에 삽입 할 수 있지만 4 개의 필드는 모두 채워지거나 그 중 일부만 선택해서 사용할 수 있습니다. 내 문제는 다음과 같습니다. 사용자가 두 필드를 채우고 다른 두 필드를 비워 두는 경우 채워진 데이터는 mysql에 삽입되어야하고 다른 빈 필드는 삽입되어서는 안된다.mysql에 삽입 된 빈 데이터 피하기

이것은 내가 가진 것입니다.

Artist:<input type="text" name="artist" /> 

Artist:<input type="text" name="artist1" /> 

Artist:<input type="text" name="artist2" /> 

Artist:<input type="text" name="artist3" /> 

// 내 PHP 코드

$sql="INSERT INTO artists (name) VALUES ('$artist'),('$artist1'),('$artist2'),('$artist3')"; 
mysql_query($sql); 

하지만 난이 쿼리를 실행할 때마다 모든 사 fields.Any 도움을 삽입하십시오. 4 개의 아티스트 필드에서 아티스트, 아티스트 1, 아티스트 2, 아티스트 3을 사용하는 것이 적절합니까? 아니면 4 개의 아티스트 필드의 이름 부분에 어쩌면 아티스트 []를 사용할 수 있습니까?

답변

1

입력 한 이름의 이름을 name="artist[]"으로 변경하십시오. 엄격하게 필요한 것은 아니지만 훨씬 쉽습니다.

Artist:<input type="text" name="artist[]" /> 
Artist:<input type="text" name="artist[]" /> 
Artist:<input type="text" name="artist[]" /> 
Artist:<input type="text" name="artist[]" /> 

다음을 처리하고 필요에 따라 사용자의 쿼리를 작성 :

$rawArtists = (isset($_POST['artist']) && is_array($_POST['artist'])) ? $_POST['artist'] : array(); 

$artists = array(); 

foreach ($rawArtists as $artist) { 
    if (is_string($artist) && strlen($artist)) { 
     $artists[] = $artist; 
    } 
} 

if (count($artists)) { 

    //This could easily be a loop... 
    //I just enjoy abusing lambdas from time to time :) 
    $artistVals = array_map(function ($art) { 
     return "('" . mysql_real_escape_string($art) . "')"; 
    }, $artists); 

    $vals = implode(',', $artistVals); 

    $query = "INSERT INTO artists (name) VALUES $vals"; 

} 
+0

@RickyNkonya 문제 없습니다. – Corbin

+0

+1 이것은 upvote 자격. 또한 lambda의 좋은 예가 - 개인적으로 저는 거기에 루프를 던질 것입니다. 람다는 PHP 5.3.0 이상에서만 사용됩니다. – MrCode

1

배열을 반환하고 배열을 반복하며 쿼리를 동적으로 만들도록 입력 필드를 구성 할 수 있습니다.

$values = array(); 
foreach($artists AS $artist) { 
    if(!empty($artist)) { 
     $values[] = "('".mysqli_real_escape_string($artist)."')"; 
    } 
} 
if(count($values) > 0) { 
    $sql = 'INSERT INTO artists (name) VALUES ' . implode(',', $values); 
} 

작동해야합니다. 그러나 mysql_* 함수는 더 이상 사용되지 않으며 mysqli_* 또는 PDO 함수를 사용하는 것이 좋습니다.

+0

내가 라인 (4)는'$ 값 [] =':)를해야한다 생각합니다. – Corbin

+0

mysqli_real_escape_string 또는 유사하게 입력 데이터를 이스케이프 처리하는 것을 잊지 마십시오. 방금 위의 게시물을 편집했습니다. –

+0

@Corbin 물론 그렇습니다. 고마워요. 정말 이른 아침이에요. 그래서 나는 아직도 천천히 태어났습니다. –

0

이 좋은 idealogy 없습니다. 두 개의 열이있는 테이블을 만들 수 있습니다.

<?php  
foreach($_GET as $name) 
    mysql_query(insert into Table_Name(ArtistName) values('$name')); 
?> 

열을 선언 NOT NULL NULL 값을 삽입 할 수 willnot 같이 하면 표과 같이 쿼리를 사용할 수

이제

Create table Table_name(
Uid int(5) Auto_increment, 
artistName varchar(20) NOT NULL 
) 

기본 키 (UID)처럼 될 수 있습니다 .

+0

나는 내 데이터베이스에 내 이름 필드가 NULL이 아니지만 내 코드를 사용하여 여전히 NULL 값이 삽입되어 있지만 당신의 조언을 주셔서 감사합니다 그것을 변경하려고합니다. –

+0

일부 시스템에서는 테이블 이름이 대소 문자를 구분합니다. 또한, 'Uid'가 기본 키가되어야합니다. 그리고 PHP 코드 조각에 따옴표가 없습니다 ... 그리고'$ name'을 이스케이프 처리해야합니다. 그리고 데이터베이스에 삽입하는 양식은'$ _POST'를 사용해야합니다. 그리고 삽입되는 값에 대해 최소한의 온건성 검사를 수행해야합니다. 나는 대답이 완벽하게 베스트 프랙티스, pedantically 완벽하게 될 것으로 기대되지 않는다는 것을 이해하지만, 이것에 많은 잘못이있다. – Corbin

+0

@ 코르 빈 고맙습니다. 그러나, 나는 그것이 어떻게 풀릴 수 있는지 보여주기위한 샘플을 만들었습니다. 나는 그를 직접 사용할 수 있도록 직접 ans을 주었다. 내가 도망 칠 줄 알았어. mysqli_real_escape_string() 대신 ADDSLASHES()를 사용하는 것이 좋습니다. mysqli_real_escape_string()을 사용할 때 실행 시간이 늘어납니다. 내가 아는 한 addslashes() 메서드로 충분해야합니다. – Prashanth

0

는 입력 필드가 배열로 같은 이름을 가질 수 있도록 :

Artist:<input type="text" name="artist[]" /> 
Artist:<input type="text" name="artist[]" /> 
Artist:<input type="text" name="artist[]" /> 
Artist:<input type="text" name="artist[]" /> 

루프 아티스트

foreach($_POST['artist'] as $artist){ 
    //insert to db if not null 
    if(trim($artist) != null){ 
     $sql="INSERT INTO artists (name) VALUES ('$artist')"; 
     mysql_query($sql); 
    } 
} 
+0

감사합니다, 작동했습니다. –

+0

@RickyNkonya이 코드를 사용하는 경우 SQL 주입을 위해 보안을 고려해야합니다. – MrCode

+0

죄송합니다. SQL 주입을 보안한다는 것은 무슨 뜻입니까? @MrCode –