从$ _POST更新BLOB字段使BLOB值为0 Bytes Long

时间:2015-10-30 04:15:38

标签: php mysql

我在现有的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();

我测试了一些东西:

  1. 我手动插入了传记(例如:在phpmyadmin或者终端等的直接sql查询中) - 成功!

  2. 我在页面本身创建了一个变量,其内容与POST变量中的内容相同(但不是从POST变量中分配它 - 只需手动在页面上进行测试) - 成功!

  3. 我把变量放在查询本身(对绑定)和$ _POST var - 失败...

  4. 我把传记数据简单化了一句简单的句子(例如:“我喜欢披萨”),但是在$ _POST var中传递了它 - 失败...

  5. 记录的原始插入(包含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

2 个答案:

答案 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追踪为什么......)。

一旦我弄明白这一点,空场就解决了,虽然为什么这种情况仍在调查中。对不起红鲱鱼,谢谢你的帮助!