所以我在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">‹ back to management consol</a></p>
</div>
</section>
'body'标签后:
<?php mysql_free_result($result);?>
正如您所看到的,这会从数据库中提取“简历”文本然后将其循环到同一页面,并进行更改以更新表格。它还检查'文本'框是否为空。
此代码适用于其他应用程序;我不明白为什么它在这里不起作用。在你开始警告我关于注射和安全性之前,我已经将大部分内容剥离出来,试图找到更新的问题。一旦我能弄明白,它就会回归。
我试过剥离文本检查;不同的变量名;在更新数据库之前将post值转储到数组中;将post值放入静态变量中;检查我所有的拼写等...
我错过了一些东西,我觉得这很简单。
答案 0 :(得分:0)
每当UPDATE
运行mysqli时,您需要运行$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
答案 1 :(得分: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年的网站,但我现在正在进入“真正的”PHP编码,而不是使用准备好的类和Dreamweaver的内置函数。学到很多,但在我有限的业余时间里很有趣。
答案 2 :(得分:0)
$result = $this->query("SELECT 1 FROM users WHERE user_username = '" . $username . "' AND user_password = '" . $password . "'");
使用逻辑AND进行用户身份验证时要小心。在使用任何类型的密码之前,首先完全验证用户名可能更为明智。关于人们插入的许多例子,我这样说 - ; WHERE 1 = 1 - 和之类的东西(不过特别是这个陈述)。当然,这可能需要两个查询,但至少您只需要处理一条信息来确定访问者是否有效。另一个优点可能是保存处理,因为您不必在应用程序或数据库中处理用户密码的散列/加密(直到用户名已经过验证)。