我在现有的MySql记录中更新BLOB字段时会遇到一种特殊的行为(就我所经历的特殊情况而言)。当我更新它时,blob值变为空 - 该字段不是NULL,但字段中的blob是0字节长。
extract($_POST);
$bio = $_POST['bio']
$cleanBio = addslashes($bio);
$sql = 'UPDATE people
SET biography = :bio
WHERE client_index = :id';
$db->query($sql);
$db->bind(array('bio', $cleanBio));
$db->bind('id', $id);
$db->execute();
我测试了一些东西:
我手动插入了传记(例如:在phpmyadmin或者终端等的直接sql查询中) - 成功!
我在页面本身创建了一个变量,其内容与POST变量中的内容相同(但不是从POST变量中分配它 - 只需手动在页面上进行测试) - 成功!
我把变量放在查询本身(对绑定)和$ _POST var - 失败...
我把传记数据简单化了一句简单的句子(例如:“我喜欢披萨”),但是在$ _POST var中传递了它 - 失败...
记录的原始插入(包含blob中的数据)成功插入。这只是创建此问题的更新。
对于那些可能导致此问题的人有什么想法吗?谢谢!
更新: 无论字段是blob还是varchar,这似乎都会发生......
提交数据的表单:
<form name=bioForm id=bioForm action=bioTest2.php method=POST>
<textarea name=bio id=bio class=textinput>
</textarea>
<input type=submit class=generalButton value="Save">
</form>
这是$ db类的精简版:
class Database2 {
private $dbh;
private $errorMsg;
private $stmt;
public function __construct() {
$dsn = "mysql:host=" . MYHOST . ";dbname=" . MYDB . ";charset=utf8";
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
try {
$this->dbh = new PDO($dsn, MYUSER, MYPASS, $options);
}
catch(PDOException $e) {
$this->errorMsg = $e->getMessage();
}
}
public function query($sql) {
$this->stmt = $this->dbh->prepare($sql);
}
public function bind($valuesArray) {
foreach($valuesArray AS $placeholder=>$value) {
$this->stmt->bindValue($placeholder, $value);
}
}
public function resultSet() {
$this->stmt->execute();
return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function single(){
$this->stmt->execute();
return $this->stmt->fetch(PDO::FETCH_ASSOC);
}
public function execute() {
$this->stmt->execute();
}
}
更新:下面是mysql日志中的记录。看起来像 查询运行了两次(虽然我只调用一次 - 有 三重检查它!)。第二个(91)具有bio的空值。 知道可能导致这种情况的原因吗?
89查询更新人 SET传记='这是一个测试字符串'WHERE client_index = 6
91查询更新客户端 SET传记=''WHERE client_index = 6
答案 0 :(得分:0)
FORM方法有问题,请检查表单方法,确保它是POST方法。
或者使用$_REQUEST
代替$_POST
它将起作用
您的SQL查询没有任何问题。
extract($_REQUEST);
$bio = $_REQUEST['bio']
$cleanBio = mysql_real_escape_string($bio);
$sql = 'UPDATE people
SET biography = :bio
WHERE client_index = :id';
$db->query($sql);
$db->bind(array('bio' => $cleanBio , 'id' => $id));
$db->execute();
答案 1 :(得分:0)
所以事实证明服务器上发生了一些事情,它几乎在最初加载时重新加载页面,而生物的$ _POST中的变量将为空,但其他表单数据不会传递(避难所& #39; t追踪为什么......)。
一旦我弄明白这一点,空场就解决了,虽然为什么这种情况仍在调查中。对不起红鲱鱼,谢谢你的帮助!