2014-01-22 4 views
-2

Я весь день вытаскиваю свои волосы, пытаясь заставить это работать. Я новичок в PHP, но в прошлом имел некоторый разумный успех. BUt Я не могу понять это.Обновление PHP в базе данных не работает

Ниже приведена обновленная таблица в моей базе данных MySQL, и код дает мне успех, но изменения не отображаются в моей базе данных. Что может быть проблемой?

Моя первая страница выглядит следующим образом (config.php связывает меня с базой данных):

<?php 
include("config.php"); 
$sql="SELECT * FROM admin"; 
$result=mysql_query($sql); 
?> 

<table width="400" border="0" cellspacing="1" cellpadding="0"> 
<tr> 
<td> 
<table width="400" border="1" cellspacing="0" cellpadding="3"> 
<tr> 
<td colspan="4"><strong>List data from mysql </strong> </td> 
</tr> 

<tr> 
<td align="center"><strong>First Name</strong></td> 
<td align="center"><strong>Last Name</strong></td> 
<td align="center"><strong>User Level</strong></td> 
<td align="center"><strong>Update</strong></td> 
</tr> 

<?php 
while($rows=mysql_fetch_array($result)){ 
?> 

<tr> 
<td><? echo $rows['firstname']; ?></td> 
<td><? echo $rows['lastname']; ?></td> 
<td><? echo $rows['userlevel']; ?></td> 

<td align="center"><a href="update.php?id=<? echo $rows['id']; ?>">update</a></td> 
</tr> 

<?php 
} 
?> 

</table> 
</td> 
</tr> 
</table> 

<?php 
mysql_close(); 
?> 


</center> 
</body> 
</html> 

После нажатия кнопки Обновить, он затем переходит на страницу с этим кодом:

<?php 
include("config.php"); 


$id=$_GET['id']; 

$sql="SELECT * FROM admin WHERE id='$id'"; 
$result=mysql_query($sql); 
$rows=mysql_fetch_array($result); 
?> 
<center> 
<table width="400" border="0" cellspacing="1" cellpadding="0"> 
<tr> 
<form name="form1" method="post" action="update_ac.php"> 
<td> 
<table width="100%" border="0" cellspacing="1" cellpadding="0"> 
<tr> 
<td>&nbsp;</td> 
<td colspan="3"><strong>Update data in mysql</strong> </td> 
</tr> 
<tr> 
<td align="center">&nbsp;</td> 
<td align="center">&nbsp;</td> 
<td align="center">&nbsp;</td> 
<td align="center">&nbsp;</td> 
</tr> 
<tr> 
<td align="center">&nbsp;</td> 
<td align="center"><strong>First Name</strong></td> 
<td align="center"><strong>Last Name</strong></td> 
<td align="center"><strong>User Level (1 to 4)</strong></td> 
</tr> 
<tr> 
<td>&nbsp;</td> 
<td align="center"> 
<? echo $rows['firstname']; ?> 
</td> 
<td align="center"> 
<input name="lastname" type="text" id="lastname" value="<? echo $rows['lastname']; ?>" /> 
</td> 
<td> 
<input name="userlevel" type="text" id="userlevel" value="<? echo $rows['userlevel']; ?>" size="15"> 
</td> 
</tr> 
<tr> 
<td>&nbsp;</td> 
<td> 
<input name="id" type="hidden" id="id" value="<? echo $rows['id']; ?>"> 
</td> 
<td align="center"> 
<input type="submit" name="Submit" value="Submit"> 
</td> 
<td>&nbsp;</td> 
</tr> 
</table> 
</td> 
</form> 
</tr> 
</table> 

</center> 
</body> 
</html> 

это затем перенаправляет на это:

<?php 
include("config.php"); 

// update data in mysql database 
$sql="UPDATE admin SET lastname='$lastname', userlevel='$userlevel' WHERE id='$id'"; 

$result=mysql_query($sql); 

// if successfully updated. 
if($result){ 
echo "Successful"; 
echo "<BR>"; 
echo "<a href='welcome.php'>Return to Dashboard</a>"; 
} 

else { 
echo "ERROR"; 
} 

?> 

он всегда повторяет, что он написал успешно, но я никогда г отпустите его, чтобы он работал один раз. В чем проблема?

Спасибо.

+0

[Не используйте mysql_ расширение *] (http://www.php.net/en/mysql_query), поскольку она является устаревшим. Вместо этого используйте [PDO] (http://php.net/manual/en/book.pdo.php) или [MySQLi] (http://php.net/manual/en/book.mysqli.php). Кроме того, ваш код широко открыт для SQL-инъекции. –

+0

Вы используете «$ lastname» и «$ userlevel», но я не вижу их в любом месте в вашем коде? – Marciano

+0

Значит, вы не обсуждаете решение вместо отметки -1. Почему вы отправили этот вопрос? – Bilal

ответ

-1

Проблемы заключаются в том, что я уверен, что вы не имеете register_globals ON в конфигурации PHP, так что $lastname, $userlevel и $id пустует.

Запрос get выполнен, потому что нет синтаксиса SQL. Он пытается установить lastname и userlevel на пустое место, где id пуст. Это нигде, поэтому ничего не происходит.

Вместо этого вы должны использовать $_POST['lastname'], $_POST['userlevel'] и $_POST['id'].

Но убедитесь, что вы избегаете значений, прежде чем вставлять/обновлять их в базе данных или привносить возможность атак SQL-Injection.

Вы также должны переключиться на mysqli или PDO, поскольку функции mysql_ * устарели и будут удалены в более новых версиях PHP.

Подготовленные утверждения также предоставят вам защиту от SQL-инъекций.

Пример:

$connection = mysqli_connect("host","user","pw","dbname"); 

$sql = "UPDATE admin SET lastname=?, userlevel=? WHERE id=?"; 
$stmt = mysqli_prepare($connection, $sql); 
mysqli_stmt_bind_param($stmt, "ssi", $_POST['lastname'], $_POST['userlevel'], $_POST['id']); 
mysqli_stmt_execute($stmt); 
+0

Привет, Марсель, спасибо, используя $ _POST, теперь отлично пишет на стол. Мне нравится ваше представление о подготовленных заявлениях в этом, но поскольку я новичок, у меня есть вопросы о вашем коде. Что делает «ssi» в вашем коде? BTW, мне не нужно $ connection, мой config.php делает соединение с базой данных. – JLA

+0

Итак, вы должны поместить вызов соединения в конфигурацию. ssi означает String String Integer. И после этого должны быть записаны 3 параметра. –

-1

Вы никогда не устанавливаете свои переменные - вы назначаете переменные для оператора обновления, который вы никогда не объявляли.

$id = $_GET('id') 
$userlevel = $_GET('userlevel') 
$lastname = $_GET('lastname') 

также, как XLAnt сказал использовать подготовленные заявления - вы смотрите на простой инъекции тузды с тем, что вы пытаетесь

другого варианта, который не является хорошим решением, чтобы не использовать подготовленные заявления, было бы использовать mysqli_real_escape_string() вокруг каждой переменной в этом обновлении и выберите оператор

-2

Ваша последняя страница PHP не знает, что $id, $lastname и $userlevel есть. Затем я предполагаю, что ваша база данных не допускает значений NULL, и что ничего не происходит ... как и ожидалось.

+0

Это не значения NULL, которые являются значениями ''. –

+0

Не уверен, что вы говорите. значения явно не установлены, поэтому они будут проверяться на 'NULL' – Viridis

+0

Пустая строка NOT NULL. Есть пустая строка, добавленная, из-за '' –

-1

В вашем последнем файле нет кода для получения значений из формы. Попробуйте изменить:

<?php 
include("config.php"); 

$userlevel = $_POST['userlevel']; 
$lastname = $_POST['lastname']; 
$id = $_POST['id']; 
// update data in mysql database 
$sql="UPDATE admin SET lastname='$lastname', userlevel='$userlevel' WHERE id='$id'"; 

Всего несколько заметок об этом;

  1. Прочитайте информацию о санации данных, так как этот код широко открыт для уязвимостей SQL-инъекций. Никогда не предполагайте, что данные, переданные на скрипты, будут чистыми или ожидаемыми.
  2. Остановить использование mysql_ * функций в PHP, поскольку они устарели от PHP 5.5. Переходите к улучшенным функциям mysqli_ *.

Надеется, что это помогает :)

Смежные вопросы