2

そのため、phpでmysqliを介してmysqlテーブルを更新する際に問題があります。

データベース接続とクラス:

<?php
class testDB extends mysqli {
    private static $instance = null;

    private $user = "tester";
    private $pass = "tester01";
    private $dbName = "testdb";
    private $dbHost = "localhost";

 public static function getInstance() {
   if (!self::$instance instanceof self) {
     self::$instance = new self;
   }
   return self::$instance;
 }

 public function __clone() {
   trigger_error('Clone is not allowed.', E_USER_ERROR);
 }
 public function __wakeup() {
   trigger_error('Deserializing is not allowed.', E_USER_ERROR);
 }

private function __construct() {
    parent::__construct($this->dbHost, $this->user, $this->pass, $this->dbName);
    if (mysqli_connect_error()) {
        exit('Connect Error (' . mysqli_connect_errno() . ') '
                . mysqli_connect_error());
    }
    parent::set_charset('utf-8');
}

public function verify_credentials ($username, $password){
   $username = $this->real_escape_string($username);
   $password = $this->real_escape_string($password);
   $result = $this->query("SELECT 1 FROM users WHERE user_username = '" . $username . "' AND user_password = '" . $password . "'");
   return $result->data_seek(0);
}

public function get_vitae() {
    return $this->query("SELECT * FROM vitae");

public function update_vitae($text, $id) {
    $text = $this->real_escape_string($text);
    $this->query("UPDATE vitae SET vitae_text=".$text." WHERE vitae_id = ".$id);
}
}
?>

ページコードは次のとおりです。

ヘッダーの上で、セッションが開始されていることを確認してログインをチェックします。次に、データベース クラスをインポートすると、同じページにフォームを再送信するときに残りが呼び出されます。

<?php
session_start();
if (!array_key_exists("username", $_SESSION)) {
    header('Location: index.php');
    exit;
}

require_once("includes/db.php");

$vitae_empty = false;

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if ($_POST['text'] == "") {
        $vitae_empty = true;
    } else if ($_POST["text"]!="") {
        testDB::getInstance()->update_vitae($_POST["text"], $_POST["id"]);
        header('Location: manage.php' );
        exit;
 } 
}

?>

本文 (ヘッダーと残りの html は「require_once」を介してインポートされます):

    <section>
        <div class="grid_3 header_line"><h2>Update for CV</h2></div>
        <div class="grid_3">
            <?php
            $result = testDB::getInstance()->get_vitae();
            $vitae = mysqli_fetch_array($result);                
            ?>

            <form name="editvitae" action="editvitae.php" method="POST">

                <textarea name="text" rows="50" cols="100"><?php echo $vitae['vitae_text'];?></textarea><br/>
                <?php if ($vitae_empty) echo "Please enter some text.<br/>";?>

                <input type="hidden" name="id" value="<?php echo $vitae["vitae_id"];?>" /> <br/>
                <input type="submit" name="savevitae" value="Save Changes"/>
            </form>
        </div>
        <div class="grid_3">
            <p><a href="manage.php">&lsaquo; back to management consol</a></p>
        </div>
    </section>

「body」タグの後:

<?php mysql_free_result($result);?>

ご覧のとおり、これはデータベースから「履歴書」テキストを取得し、それを同じページにループして変更を加え、テーブルを更新します。また、「テキスト」ボックスが空でないことを確認します。

このコードは別のアプリケーションで機能します。ここでうまくいかない理由がわかりません。そして、あなたがインジェクションとセキュリティについて私に警告し始める前に、私はアップデートの問題を見つけようとしてそのほとんどを取り除きました. 私がそれを理解できたら、それは元に戻ります。

テキストチェックを削除しようとしました。異なる変数名; データベースを更新する前に投稿値を配列にダンプします。投稿値を静的変数に入れます。すべてのスペルチェックなど...

何かが欠けていて、シンプルになりそうな気がします。

4

3 に答える 3

0

mysqliを介して実行されるときはいつでも、メソッドUPDATEを実行する必要があります$mysqli->commit();

あなたの新しいものは次のupdate_vitaeようになります:

public function update_vitae($text, $id) {
    $text = $this->real_escape_string($text);
    $this->query("UPDATE vitae SET vitae_text=".$text." WHERE vitae_id = ".$id);
    $this->commit;
}

mysqliには、オンとオフを切り替えることができる自動コミット機能もあります。

$this->autocommit(true); //on
$this->autocommit(false); //off
于 2012-11-21T21:26:33.743 に答える
0

ですから、答えは実にシンプルでした。アンドリューシが示唆したように、更新文字列でのエスケープでした。これを修正したアップデートは次のとおりです。

public function update_vitae($text, $id) {
    $text = $this->real_escape_string($text);
    $this->query("UPDATE vitae SET vitae_text = '$text' WHERE vitae_id = ".$id);
}

助けてくれてありがとう!

私はほぼ 10 年間 Web サイトを設計してきましたが、準備されたクラスや Dreamweaver の組み込み関数を使用する代わりに、「実際の」php コーディングを始めたばかりです。学ぶことはたくさんありますが、限られた時間の中で楽しく学べます。

于 2012-11-21T22:06:31.230 に答える