2010-11-29 4 views
0

나는 이것에 대해 잠시 혼란스러워했지만 거의 다 왔어. 이 벽을 지나쳐 가야 겠어.이 SQL 쿼리에 대한 PHP 코드를 어떻게 수정할 수 있습니까?

tracks (trackid, tracktitle, albumid, composerid) 
albums (albumid, albumname) 
composers (composerid, composername) 

나는

INSERT INTO tracks (tracktitle, albumid, composerid) VALUES ('New Song', 1, 1); 

와 phpMyAdmin을 SQL 탭을 통해 새로운 레코드를 삽입 할 수 있고 그것을 잘 작동합니다 :

나는 다음과 같은 테이블이있다.

내 PHP 양식은 똑같은 일을하지는 않지만 뭔가를 간과해야합니다. 누군가 내 addtrack 페이지의 코드를 확인하고 무엇이 잘못되었는지 말해 줄 수 있습니까?

if (isset($_POST['tracktitle'])): 
// A new track has been entered 
// using the form. 

$cid= $_POST['cid']; 
$tracktitle = $_POST['tracktitle']; 
$albs = $_POST['albs']; 

if ($cid == '') { 
exit('<p>You must choose an composer for this track. 
Click "Back" and try again.</p>'); 
    } 

    $sql = "INSERT INTO tracks SET 
    tracks.tracktitle='$tracktitle'" ; 
    if (@mysql_query($sql)) { 
    echo '<p>New track added</p>'; 
    } else { 
    exit('<p>Error adding new track' . mysql_error() . '</p>'); 
    } 

    $trackid = mysql_insert_id(); 

    if (isset($_POST['albs'])) { 
    $albs = $_POST['albs']; 
    } else { 
    $albs = array(); 
    } 

    $numAlbs = 0; 
    foreach ($albs as $albID) { 
    $sql = "INSERT IGNORE INTO tracks (trackid, albumid, 
    composerid) VALUES " . 
"($trackid, $albs, $cid)"; 

if ($ok) { 
    $numAlbs = $numAlbs + 1; 
} else { 
    echo "<p>Error inserting track into album $albID: " . 
     mysql_error() . '</p>'; 
} 
} 
?> 

<p>Track was added to <?php echo $numAlbs; ?> albums.</p> 

<p><a href="<?php echo $_SERVER['PHP_SELF']; ?>">Add another 
track</a></p> 
<p><a href="tracks.php">Return to track search</a></p> 

<?php 
else: // Allow the user to enter a new track 

$composers = @mysql_query('SELECT composerid, composername 
FROM composers'); 
    if (!$composers) { 
exit('<p>Unable to obtain composer list from the 
database.</p>'); 
} 

$albs = @mysql_query('SELECT albumid, albumname FROM albums'); 
if (!$albs) { 
exit('<p>Unable to obtain album list from the 
database.</p>'); 
} 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" 
method="post"> 
<p>Enter the new track:<br /> 
<textarea name="tracktitle" rows="1" cols="20"> 
</textarea></p> 
<p>Composer: 
<select name="cid" size="1"> 
    <option selected value="">Select One</option> 
    <option value="">---------</option> 
    <?php 
    while ($composer= mysql_fetch_array($composers)) { 
    $cid = $composer['composerid']; 
    $cname = htmlspecialchars($composer['composername']); 
    echo "<option value='$cid'>$cname</option>\n"; 
    } 
    ?> 
    </select></p> 
    <p>Place in albums:<br /> 
    <?php 
    while ($alb = mysql_fetch_array($albs)) { 
    $aid = $alb['albumid']; 
    $aname = htmlspecialchars($alb['albumname']); 
    echo "<label><input type='checkbox' name='albs[]' 
    value='$aid' />$aname</label><br />\n"; 
    } 
    ?> 

이렇게 정렬하면 확장하고 보안 문제를 분류 할 수 있습니다. 여기에있는 누군가는 나에게 새로운 것이있는 PDO를 들여다 보았습니다. 그러나 한 번에 하나 개의 장애물 ....

감사

+0

오류 메시지가 표시됩니까? 그렇다면 무엇이 표시됩니까? - 편집 : 사실, 지금 문제가 나타납니다. – Teekin

+0

맨 마지막에'endif;'가 빠져 있습니다 ('':''는 결코 닫히지 않습니다). – Yahel

+0

어떤 DBMS를 사용하고 있습니까? 호기심이 있습니까? – Teekin

답변

1

귀하의 INSERT 구문이 올바르지 않습니다. UPDATE 구문을 사용하여 INSERT하려고합니다.

INSERT INTO table_name SET field_name = '$value', another_field_name = '$another_value' 

하지만 당신은 일을해야한다 :

당신이하려고하는

INSERT INTO table_name (
    field_name, 
    another_field_name 
) 
VALUES (
    '$value', 
    '$another_value' 
) 

을 또한, 당신은 정말 이런 식으로, addslahes()를 사용한다 : 그렇지 않으면

INSERT INTO table_name (
    field_name, 
    another_field_name 
) 
VALUES (
    '".addslashes($value)."', 
    '".addslashes($another_value)."' 
) 

귀하의 코드는 삶은 감자보다 해킹하기 쉽습니다. :)

EDIT : Chad Birch (아래)는 addslashes()보다 더 나은 매개 변수화 된 값을 사용하는 것을 제안합니다. 나는 정직하게 PHP가 그것들을 이미 가지고 있다는 것을 몰랐다.

+1

'INSERT INTO table_name SET field_name = 'foo', another_field_name = 'bar'는 MySQL에서 완벽하게 유효합니다. – simshaun

+0

글쎄, 난 빌어 먹을거야! 내 MySQL 설치에서는 작동하지만 MS-SQL에서는 작동하지 않습니다. 확실히 그것은 표준 SQL 아니지만? – Teekin

+1

'addslashes()'역시 좋은 보호 장치가 아닙니다. 일반적으로 Mysqli 또는 PDO 함수를 통해 수행되는 매개 변수화 된 쿼리를 살펴보십시오. –

0

문제가 쿼리에 있습니다. mysql_error 함수를 사용하여 잘못하고있는 것에 대한 추가 정보를 얻으십시오.

예를 들어 INSERT 문이 잘못되었습니다.

당신은이 :

$sql="INSERT INTO tracks (tracktitle) VALUES ('$tracktitle')"; 
+0

감사합니다. Wifi, 나는 코드의 다른 섹션에서이 부분을 이미 수정했지만 분명히이 부분을 놓친 것 같습니다. 분명히 그 차이를 알지 못했습니다. 모든 시간을 학습 .... – paj

+0

아무 문제가 없습니다 Paj, 우리는 서로를 도울 수 있습니다 : D 환호 –

+0

의견의 첫 번째 배치를 상세히 설명했지만 여전히 문제가 있습니다. 그것을 해결할 수 없습니다 .. – paj

0

내 이전의 대답은 잘못 (및 삭제) :

$sql="INSERT INTO tracks SET tracks.tracktitle='$tracktitle'" 

그것은 무언가 같이해야한다. 삽입 구문이 실제로 유효하다는 것을 알았습니다.

하지만 수행하지 않는 것은 쿼리에 입력 한 값을 이스케이프 처리하는 것입니다. $ tracktitle에 작은 따옴표와 같은 잘못된 문자가 포함되어 있으면 쿼리가 중단 될 수 있습니다.

당신은 당신의 삽입 쿼리를 작성하기 전에이 줄을 추가해야합니다

$tracktitle = mysql_real_escape_string($tracktitle); 

당신은 현재의 코드는 매우 dangarous 입니다. 내가 노래를 삽입한다면 노래 이름에 YourF ... 에드, 오하이오를 입력 '; 데이터베이스 Drop YourDataBaseName; 무슨 일이 일어날 지 상상해보십시오.

이것은 SQL 주입으로 알려져 있습니다. 값을 올바르게 이스케이프 처리하지 않기 때문에 다른 사람이 html 양식 필드에 삽입하여 문장을 닫을 수 있습니다.

이것이 쿼리가 현재 작동하지 않는 이유인지는 모르겠지만 (잘못된 문자를 입력하는 경우에만 중단됩니다) 현재로서는 심각한 문제입니다.

정확한 오류를 찾으려면 mysql_query()가 false를 반환 할 때 mysql_error() 결과를 표시해야합니다. 이것은 우리가 여기서 만들 수있는 임의의 추측보다 더 많은 도움이 될 것입니다.

+0

고마워요. 나는 더 깊이 파고 들어 PDO의 내용을 읽어 볼 것입니다. – paj

관련 문제