ОБНОВЛЕНИЕ 2: я так и не нашел решения этого. Поскольку код инструктора легко доступен для использования и взлома вместе с нашим собственным, и я уже потратил несколько недель на отладку, я просто создал новую таблицу и начал с его кода, внес изменения и протестировал его по мере продвижения, пока В итоге я получил то, что хотел по функциональности. Если кто-нибудь найдет причину странного поведения, я искренне признателен за то, чтобы узнать, чем это вызвано.
Почти каждый, кто что-то предлагал, предлагал идеи, которые я уже пробовал, и перечислял их как уже опробованные в моем исходном посте. Спасибо всем, кто предлагает свои идеи, но, пожалуйста, внимательно прочитайте сообщения, прежде чем вносить предложения.
ОБНОВЛЕНИЕ: чтобы более четко изложить мой главный вопрос. Исходный пост находится ниже со всем кодом, а также с тем, что я пробовал.
Я разработал свою функцию updateData () для обновления записи. Вместо этого он возвращает свой код ошибки.
sub updateData {
# and this returns "Update Failed!" for me. I can't figure out why.
$sql = "UPDATE friendface SET first_name = '$first_name',
last_name = '$last_name',
email_address = '$email_address',
password = '$password'
WHERE user_id = $user_id;";
$rc = $dbh->do($sql);
if ($rc != 1) {
print "Update Failed!";
}
}
Ниндзя редактирует, пока я перечитываю этот беспорядок 3:
Код внизу. Извините, если форматирование ужасное или я недостаточно описательный. Я очень старался. Спросите, могу ли я предоставить что-нибудь еще полезное.
Всем привет,
Здесь школьное задание, распечатайте таблицу с записями, которые вы можете редактировать и удалять.
У меня есть HTML-страница с формами для вставки данных, затем Perl-скрипт, который отображает таблицу с кнопками для обновления и удаления. Удалить работает нормально. Весь сценарий работает нормально (ЗА ИСКЛЮЧЕНИЕМ ссылки из блока текста, который вы получаете при прямом доступе к .pl, но в данный момент меня это не волнует) без содержимого моей функции UPDATE. Код функции UPDATE отлично работает построчно в MySQL. Но я не могу заставить функцию updateData
с запросом UPDATE работать в моем файле .pl.
Нам разрешен полный доступ к образцу кода инструктора. Я МОГ начать с его страницы, а затем преобразовать ее в свою. Я бы предпочел написать свою страницу, не полагаясь на этот костыль. Однако я сравниваю свой код с его и не понимаю, в чем я ошибаюсь. Насколько я знаю / могу найти документацию, синтаксис выглядит неплохо.
Я все равно на всякий случай поигрался с разным синтаксисом. Поместите запятую после последней записи перед моим предложением WHERE, потому что без него оно выглядело неправильно, но, очевидно, без него - это путь. Все, что я прочитал, говорит о том, что текущий синтаксис правильный.
Я подумал, что, возможно, он пытался отредактировать
user_id
, которого не было, но печатьuser_id
показала, что используется правильный.Я думаю, что мой
DBI->connect
работает, потому что он не возвращает сообщение «Ошибка подключения».Правильная функция,
updateData()
, выполняется, потому что конечный результат - это код возврата Ошибка обновления, уникальный для этой функции.Я могу отследить код с помощью кнопки «Правка»> «Форма редактирования»> «Подтвердить функцию редактирования»> «Функция updateData»> $ dbh успешно аутентифицируется,
do($sql)
, это мой запрос UPDATE, который выглядит синтаксически правильным. Но почему-то$dbh->do($sql);
не соответствует действительности.В функции
updateData
я подумал, что проблема не в том, что я обновляю только 4 из 6 полей. Ну, 5, так как ключ никогда не будет обновляться. В любом случае, я подумал, что это может как-то сбить его с толку, но добавление строки для обновления имени пользователя не помогло, поэтому я снова вынул ее.
Я действительно пытался разобраться в этом самостоятельно и выдергивал волосы. Это всегда какая-то тупая мелочь. Это интервал? Обычно это не имеет значения, но я знаю, что ENDFORM
должен был быть первым и единственным, что поставили на карту, чтобы работать на меня. Но я не знаю никаких правил использования интервалов для этого конкретного кода. Пожалуйста. Укажите мне правильное направление.
Чтобы быть точным, printEditButton()
и printDeleteButton()
- это код для кнопок редактирования и удаления ...
Таблица DESC, код для html-страницы и скрипт pl следующие:
*********************
*********************
***DESC friendface***
*********************
*********************
Field Type Null Key Default Extra
user_id int(11) NO PRI NULL auto_increment
username char(50) YES NULL
first_name char(20) YES NULL
last_name char(20) YES NULL
email_address char(50) YES NULL
password char(50) YES NULL
*********************
*********************
*friendFaceForm.html*
*********************
*********************
<table bgcolor='antiquewhite' align=center cellpadding=2>
<form action='friendFaceForm.pl' method=GET>
<tr>
<td align=right>Username</td>
<td><input type=text name=username></td>
</tr>
<tr>
<td align=right>First Name</td>
<td><input type=text name=first_name></td>
</tr>
<tr>
<td align=right>Last Name</td>
<td><input type=text name=last_name></td>
</tr>
<tr>
<td align=right>Email Address</td>
<td><input type=text name=email_address></td>
</tr>
<tr>
<td align=right>Password</td>
<td><input type=text name=password></td>
</tr>
<tr>
<td align=center colspan=2> <input type=submit name=action value='Insert Data'></td>
</tr>
</form>
</table>
*********************
*********************
**friendFaceForm.pl**
*********************
*********************
#!/usr/bin/perl
use CGI qw(:standard);
use DBI;
use warnings;
print "Content-type: text/html\n\n";
$dbh = DBI->connect("DBI:mysql:jwiard1:localhost", "jwiard1", "jwiard1")
or endProgram("Connection Failed!");
$action = param('action');
$user_id = param('user_id');
$username = param('username');
$first_name = param('first_name');
$last_name = param('last_name');
$email_address = param('email_address');
$password = param('password');
if ($action eq 'Insert Data') {
#$action holds this value coming from the html page
#this happens first
insertData();
printTable();
}
elsif ($action eq 'Edit') {
#prints the edit form
printEditForm();
}
elsif ($action eq 'Confirm Edit') {
#then updateData() runs
updateData();
printTable();
}
elsif ($action eq 'Delete') {
deleteData();
printTable();
}
elsif ($action eq 'Print Table') {
printTable();
}
else {
print "Either you are accessing this file directly or \$action has an unaccounted for value.<br><br>
If it's the former, get out of here!<br><br>
If it's the latter... you're getting sleepy. You're getting verrrry sleepy. When you reach the end of this sentence, you'll wake up with no memory of this page and a strong feeling that Joe Wiard's code is perfect.<br><br>
...or did you just want to see the table?";
print "<input type=submit name=action value='Print Table'>";
}
####
#Functions! Yay!
####
sub endProgram {
my ($msg) = @_;
print $msg;
die();
}
sub insertData {
#after inserting data, the user is left to click Edit or Delete
#making $action hold the value of 'Edit' or 'Delete' Go to elsif($action eq 'Edit'
print "Your data has been saved.";
$sql = "INSERT INTO friendface SET user_id='$user_id',
username='$username',
first_name='$first_name',
last_name='$last_name',
email_address='$email_address',
password='$password' ;";
$rc = $dbh->do($sql);
if ($rc != 1) {
print "Insert failed!";
}
}
sub printEditButton {
print "<form>";
print "<input type=hidden name=user_id value='$href->{user_id}'>";
print "<input type=submit name=action value='Edit'>";
print "</form>";
}
sub printDeleteButton {
print "<form>";
print "<input type=hidden name=user_id value='$href->{user_id}'>";
print "<input type=submit name=action value='Delete'>";
print "</form>";
}
sub confirmEdit {
}
sub lookUpRow {
$sql = "SELECT * FROM friendface WHERE user_id=$user_id;";
$sth = $dbh->prepare($sql);
$rc = $sth->execute();
$href = $sth->fetchrow_hashref();
}
sub printEditForm {
#prints fields for 4 of the values in a record. I don't want the user to be able to
#change their username. They can only edit first and last names, email and password.
#after this, $action either holds 'Confirm Edit' or 'Cancel'. Go to elsif
#($action'Confirm Edit')
lookUpRow();
print <<ENDOFFORM;
<form>
First Name: <input type=text name=first_name value='$href->{first_name}'> <br>
Last Name: <input type=text name=last_name value='$href->{last_name}'> <br>
Email Address: <input type=text name=email_address value='$href->{email_address}'> <br>
Password: <input type=text name=password value='$href->{password}'> <br>
<input type=hidden name=user_id value=$href->{user_id}'> <br>
<input type=submit value="Confirm Edit" name=action>
<input type=submit value="Cancel" name=action>
</form>
ENDOFFORM
#It seems that ENDOFFORM *MUST* be at the beginning of the line. No TABS or SPACES
#preceeding, and NOTHING after. Half an hour of debugging lead me to discovery this
#tidbit that I should have just remembered from class. Or Googled. :P
}
sub updateData {
#and this returns "Update Failed!" for me. I can't figure out why.
$sql = "UPDATE friendface SET first_name = '$first_name',
last_name = '$last_name',
email_address = '$email_address',
password = '$password'
WHERE user_id = $user_id ;";
$rc = $dbh->do($sql);
if ($rc != 1) {
print "Update Failed!";
}
}
sub deleteData {
$sql = "DELETE FROM friendface WHERE user_id = $user_id;";
$rc = $dbh->do($sql);
}
sub printTable {
$sql = "SELECT * FROM friendface;";
$sth = $dbh->prepare($sql);
$rc = $sth->execute();
$count = 0;
print "<table>";
#print header
while ($href = $sth->fetchrow_hashref() ) {
$count ++;
if ($count % 2 == 0) {
print "<tr bgcolor=lightblue>";
}
else {
print "<tr bgcolor=lightgray>";
}
print "<td>";
print $href->{'user_id'};
print "</td>";
print "<td>";
print $href->{'username'};
print "</td>";
print "<td>";
print $href->{'first_name'};
print "</td>";
print "<td>";
print $href->{'last_name'};
print "</td>";
print "<td>";
print $href->{'email_address'};
print "</td>";
print "<td>";
print $href->{'password'};
print "</td>";
print "<td>";
printEditButton();
print "</td>";
print "<td>";
printDeleteButton();
print "</td>";
print "</tr>";
}
print "</table>";
$rc
, когда ОБНОВЛЕНИЕ ведет себя не так, как вы ожидаете? Это определено? Это 0E0? - person pilcrow   schedule 06.12.2013