2013-07-04 7 views
0

Я пытался создать простую форму для обновления сведений о базе данных, код PHP ниже:PHP SQL Update Query не работает

// UPDATE THE DATABASE RECORDS // 
$update = $_GET['update']; 
if($update == "true"){ 
    $setDetails="UPDATE users SET email='{$_POST['email']}', api_key='{$_POST['api_key']}', api_secret='{$_POST['api_secret']}' WHERE username='{$_POST['username']}'"; 
    if(mysql_query($setDetails)){ 
     $updatemsg = '<div class="alert alert-success"><a href="#" class="close" data-dismiss="alert">×</a><strong>Success!</strong> Your details have been updated in our database.</div>'; 
    }else{ 
     $updatemsg = '<div class="alert alert-error"><a href="#" class="close" data-dismiss="alert">×</a><strong>Failure!</strong> Your details could not be updated in our database. Please try again later or contact us if this keeps happening.</div>'; 
    } 
}else if($update == "false"){ 
    $updatemsg = '<div class="alert alert-success"><a href="#" class="close" data-dismiss="alert">×</a><strong>Success!</strong> Your changed were discarded.</div>'; 
} 
// UPDATE THE DATABASE RECORDS // 

// GET THE DATABASE RECORDS // 
$getDetails="SELECT * FROM users WHERE username='$username'"; 
$details=mysql_query($getDetails); 
$num=mysql_numrows($details); 
if($num != 0){ 
    $new_user = false; 
    $username=mysql_result($details,0,"username"); 
    $email=mysql_result($details,0,"email"); 
    $subscription_type=mysql_result($details,0,"subscription_type"); 
    $subscription_date=mysql_result($details,0,"subscription_date"); 
    $api_key=mysql_result($details,0,"api_key"); 
    $api_secret=mysql_result($details,0,"api_secret"); 
    setcookie("api_key", $api_key, time()+50000); 
    setcookie("api_secret", $api_secret, time()+50000); 
}else{ 
    $new_user = true; 
} 
// GET THE DATABASE RECORDS // 

Переменные, определенные при записи базы данных извлекаются затем используются для заполнения HTML-формы:

<form action="?update=true" method="POST"> 
<h2>Your Details</h2> 
<input id="username" name="username" type="text" placeholder="" disabled="true" class="input-xlarge" value="<?=$username?>"> 
<input id="email" name="email" type="text" placeholder="" class="input-xlarge" value="<?=$email?>"> 
<input id="subscription_type" name="subscription_type" type="text" placeholder="" disabled="true" class="input-xlarge" value="<?=$subscription_type?>"> 
<input id="subscription_date" name="subscription_date" type="text" placeholder="" disabled="true" class="input-xlarge" value="<?=$subscription_date?>"> 
<input id="api_key" name="api_key" type="text" placeholder="" class="input-xlarge" value="<?=$api_key?>"> 
<input id="api_secret" name="api_secret" type="text" placeholder="" class="input-xlarge" value="<?=$api_secret?>"> 
<button type="submit" class="btn btn-success" id="saveChanges"><i class="icon-ok icon-white"></i> Save Changes</button> <a href="?update=false" class="btn btn-danger" id="discardChanges"><i class="icon-remove icon-white"></i> Discard Changes</a> 
</form> 

когда страница загружается первый раз, форма заполняется без проблем, но когда он редактируется и представлен $updatemsg является второй один (успех), но нет никаких изменений данные в базе данных. Есть идеи?

+0

Вы, вероятно, (по праву) получите несколько комментариев, говорящих вам, что вы уязвимы для инъекционной атаки, потому что вы вставляете свои переменные $ _POST прямо в ваш запрос. Взгляните на mysql injection, вам нужно знать об этом, если вы занимаетесь программированием базы данных. – JPR

+0

@JPR Я знаю, что я уязвим для инъекций, и я намерен разобраться в этом до того,/если этот код когда-либо будет жить - на данный момент это только я практикую. –

+1

почему ваши поля формы отключены ??? это единственная причина, по которой значения не публикуются. – Naeem

ответ

2

Похоже, что это неудачно, потому что котировки и скобки неправильно используются. Но то, что вам нужно сделать, это что-то вроде:

$email = mysql_real_escape_string($_POST['email']); 

.... 

"UPDATE users SET email='$email'..... 

И так далее, и так далее. Если это не так, в другой части вызовите mysql_error(), и он скажет вам, если запрос не работает.

+0

Это исправило это, спасибо! Просто из интереса, частично ли это устраняет проблему с SQL-инъекцией? –

+0

Короткий ответ, да, но я верю, что есть даже способы обойти это, поэтому еще одним словом нет. Лучшей практикой будет использование связанных с PDO параметров - отключение функций mysql_() и чтение PDO. Насколько я знаю, это полностью исключает проблему инъекции. Я думаю, можно с уверенностью сказать, что использование PDO/подготовленных операторов является «правильным» способом правильного использования SQL с PHP. – JPR

0

Во-первых, я объявляю секреты api в постоянном файле, а не через http-сообщение на странице. Попробуйте выполнить следующие действия, чтобы получить обновление для работы при условии, почтовые значений присутствуют

$ setDetails = "пользователи UPDATE SET по электронной почте = '". $ _ POST [ 'электронной почты']. " ' api_key ='". $ _POST ['api_key']. ", Api_secret = '". $ _ POST [' api_secret ']. "' WHERE username = '". $ _ POST [' username ']. "'";

+0

Секреты API хранятся в базе данных и вводятся/изменяются только через HTTP-сообщение. –