2014-12-03 2 views
1

내 사이트에서 현재 위치에서 편집 작업을하고 있습니다. 이제 필요한 모든 것을 설정했습니다. 사용자가 제출을 클릭하면 div 요소의 id (내용의 종류)과 업데이트 할 새 값을 보냅니다. 이 정보를 업데이트하지 않는 이유를 모르겠어요장소 수정 업데이트 텍스트

if($pedit = $mysqli->prepare("UPDATE `accounts` SET ? = ? WHERE `id`= ? ")){ 
    $pedit->bind_param("sss", $id, $value, $_SESSION["user_id"]); 
    $pedit->execute(); 
    $pedit->free_result(); 
    $pedit->close(); 
} 

:

여기 내 코드입니다. $id = 설명, 전체 이름, 이메일 등 변경 행 $value = $id에 대한 새로운 정보입니다. 사용자는 자신의 프로파일 정보를 업데이트 할 수 있습니다.

이 코드는 어떤 종류의 오류도 표시하지 않지만 계속 업데이트하지는 않습니다.

+0

_column 또는 table_ 식별자 대신 '?'자리 표시자를 사용할 수 없으므로 작동하지 않습니다. 스칼라 값 (열에 할당 된 값)에 대해서만 사용할 수 있습니다. –

+0

입력 변수'$ id'의 경우 자리 표시자를 사용할 수 없습니다. 대신, 당신은'prepare()/bind_param()/execute()'을 사용하여 피하려고했던 쿼리에 그 변수를 넣어야 만합니다. 그러나 먼저 허용 가능한 컬럼 이름의 배열로 그 변수의 유효성을 검사 할 수 있습니다. 나는 그것을 설명하는 기존의 질문을 찾고있다 - 이것은 종종 묻는다 ... –

답변

5

준비된 문에서 매개 변수로 열 이름을 지정할 수 없습니다. 대신 준비하기 전에 문 이름을 열 이름으로 대체해야합니다. 편집 가능한 열 이름을 허용 목록에 추가하여 원하지 않는 SQL이 실행되지 않도록하십시오.

<?php 
$accounts_editable_cols = array(
    'name'=>true, 'street'=>true, 'city'=>true, 
    'region'=>true, 'postal'=>true, 'phone'=>true 
); 

// prevent SQL injection by whitelisting column names 
if (!array_key_exists($id, $accounts_editable_cols)) return false; 

$pedit = $mysqli->prepare("UPDATE `accounts` SET $id = ? WHERE `id`= ? ") 
if ($pedit) { 
    $pedit->bind_param("ss", $value, $_SESSION["user_id"]); 
    $pedit->execute(); 
    $pedit->free_result(); 
    $pedit->close(); 
}