0

PHP初心者を正しい方向に向けることができる人はいますか? データベースは更新されず、わかりません。変更したい記事を取得してフォームに入れ、「update1.php」ファイルを使用してデータベースを更新します。

記事の取得:

<?php
include ('../db_connect.php');

$getid = $_GET['artikkelID'];

$query = mysql_query('SELECT tittel, ingress, publ, tekst, forfatter, bildetekst, photo FROM hovedartikler WHERE artikkelID = "' . $getid . '"');
$rows = mysql_fetch_assoc($query);

$titteldb = $rows['tittel'];
$ingressdb = $rows['ingress'];
$tekstdb = $rows['tekst'];
$forfatterdb = $rows['forfatter'];
$bildetekstdb = $rows['bildetekst'];
$photodb = $rows['photo'];

echo '<form action="update1.php" method="post" enctype="multipart/form-data">

<span>
ArtikkelID 
<input type="text" name="artikkelID" readonly="readonly" size="3" value="' . $getid . '">
</span>

<span style="margin-left: 20px;">
Artikkelens Tittel ( maks 100 tegn)
<input type="text" name="tittel" cols="80" size="50" value="' . $titteldb . '" /><br />
</span>
<br />

Ingress (maks 255 tegn)<br />
<textarea name="ingress" rows="4" cols="60" />' . $ingressdb . '</textarea><br />

Artikkelens tekst (ingen begrensning på antall tegn)<br />
<textarea id="textarea1" name="tekst" size="100%">' . $tekstdb . '</textarea>
<script language="javascript1.2">
generate_wysiwyg("textarea1");
</script>


Skriv inn artikkelens forfatter (maks 50 tegn)<br />
<input type="text" name="forfatter" size="80" cols="80" value="' . $forfatterdb . '" /><br />

Skriv inn tekst til artikkel-bilde<br />
<textarea name="bildetekst" rows="3" cols="60">' . $bildetekstdb . '</textarea><br />

Last opp bilde til bruk i artikkelen<br />
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input type="file" name="file" size="80" value="' .   $photodb . '" /><br />

<br />
<input type="submit" name="submit" value="Oppdater" />
</form>';   

?>

そして更新スクリプト:

<?php

$id = $_POST['artikkelID'];
$tittel = $_POST['tittel'];
$ingress = $_POST['ingress'];
$tekst = $_POST['tekst'];
$forfatter = $_POST['forfatter'];
$bildetekst = $_POST['bildetekst'];
$pic = $_FILES['file']['name'];



include '../db_connect.php';

if(isset($_POST['Oppdater']))

$mysql_query=("UPDATE hovedartikler SET 
tittel='" . $_POST['tittel'] . "', ingress='" . $_POST['ingress'] . "', tekst='" . $_POST['tekst'] . "', forfatter='" . $_POST['forfatter'] . "', bildetekst='" . $_POST['bildetekst'] . "', file='" . $_FILES['pic'] . "' WHERE artikkelID='$id'")
or die (mysql_error());

mysql_query($query);
echo "Artikkelen er oppdatert!<br/><br/>
Du vil n&aring; automatisk bli dirigert til Admin-forsiden.";

print_r($ingress);

mysql_close();
?>
<script type="text/javascript">
setTimeout("window.location.href='http://mss-seil.no/admin/adminIndex.php'", 3000);
</script>

すべての助けに感謝します!

4

4 に答える 4

1
$mysql_query=("UPDATE hovedartikler SET tittel='" . $_POST['tittel'] . "', ingress='" . $_POST['ingress'] . "', tekst='" . $_POST['tekst'] . "', forfatter='" . $_POST['forfatter'] . "', bildetekst='" . $_POST['bildetekst'] . "', file='" . $_FILES['pic'] . "' WHERE artikkelID='$id'") or die (mysql_error());

「$query」ではなく「$mysql_query」であることに注意してください。

mysql_query($mysql_query);

いくつかの補足事項もあります。

  • mysql_* 関数は実際には使用しないでください。mysqliまたはPDOを見てください。
  • 入力をデータベースに挿入する前にサニタイズしていません。これは良い考えではありません。SQL インジェクション攻撃に対して無防備なままにしておくことになります。文字列をエスケープし、整数を整数としてキャストする必要があります。最初の提案に従い、PDO または mysqli を使用する場合は、準備済みステートメントの使用を検討してください。

それが役立つことを願っています!

于 2013-03-27T22:30:04.143 に答える
1

SQL-Injections を探して、$_POST から値をエスケープしてください:) - そして、Javascript リダイレクトは、「ヘッダー」を持つサーバー側の PHP リダイレクトに置き換えることができると思います。

$mysql_query=("UPDATE hovedartikler SET 
tittel='" . $_POST['tittel'] . "', ingress='" . $_POST['ingress'] . "', tekst='" . $_POST['tekst'] . "', forfatter='" . $_POST['forfatter'] . "', bildetekst='" . $_POST['bildetekst'] . "', file='" . $_FILES['pic'] . "' WHERE artikkelID='$id'")
or die (mysql_error());

mysql_query($query);

Update-Statement で変数「$mysql_query」を取得しました。ただし、変数「$query」を mysql_query 関数に送信します。$mysql_query 変数を mysql_query 関数に送信するべきではありませんか? たぶん、より良い変数名が役立つかもしれません:)

于 2013-03-27T22:30:16.787 に答える
1

まず、関数の使用をやめて、 mysqliまたはPDOとバインドされた値を持つ準備済みステートメントの使用を開始しないと、 SQL インジェクション攻撃に直面することになります。mysql_*

次に、変数を設定するときに、実際のクエリと die ステートメントの周りのブラケットを変更mysql_query($query)して削除します。mysql_query($mysql_query)保持されているクエリを実行しようとしています$queryが、UPDATE クエリは実際には保持されています$mysql_query

次のようになります。

$mysql_query = "UPDATE hovedartikler SET 
tittel='" . $_POST['tittel'] . "', ingress='" . $_POST['ingress'] . "', tekst='" . $_POST['tekst'] . "', forfatter='" . $_POST['forfatter'] . "', bildetekst='" . $_POST['bildetekst'] . "', file='" . $_FILES['pic'] . "' WHERE artikkelID='$id'";

mysql_query($mysql_query);
于 2013-03-27T22:27:40.680 に答える
1

これが原因かどうかはわかりませんが、2 つのファイルで異なる引用符を使用しています。

取得中:

"' . $getid . '"'

そして設定では

WHERE artikkelID='$id'"

artikkelID とはどのようなデータ型ですか?

それがintの場合、二重引用符は文字列の引用符ではなく、予約語の名前を持つ列を持つために使用できる「グループ化」の引用符であるため、最初の引用符は機能します

一重引用符は文字列の引用符であるため、最後は機能しません。また、int 列に string を使用することはできません。

例えば

このような int 列を照会できます

WHERE id > "20"

しかし、このようではありません

WHERE id > '20'

一方、文字列列の場合

WHERE name = "Hello World"

名前列を、Hello World 文字列ではなく、Hello World 列と一致させようとします。

于 2013-03-27T22:32:09.483 に答える