【问题标题】:Insert Varbinary data on Mysql table via php通过php在Mysql表上插入Varbinary数据
【发布时间】:2013-03-15 08:25:04
【问题描述】:

我有一个小问题,我相信有人可以解决它 我有一个从一组无符号整数转换而来的二进制数据

$_BIN=pack('I*', 3563547,6587568,5468456,6458568,4568568);

我想将它插入到包含 varbinary 列的表中

$strSQL = "INSERT INTO table_name (id, ba) VALUES($id, $_BIN)";

由于某种原因,我收到以下错误

错误的 SQL:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“_”附近使用正确的语法 SQL 字符串 : INSERT INTO table_name (id, ba) VALUES(467, ('ùZ¢O ^,¦EòÇjÞ|²EÎóÇjÞ|²EÎóp>)

希望大家能帮帮我

【问题讨论】:

    标签: php mysql insert pack varbinary


    【解决方案1】:

    这对我有用:

    DROP TABLE IF EXISTS `binary`;
    CREATE TABLE `binary`(
    id INT NOT NULL AUTO_INCREMENT, 
    ba VARBINARY( 100 ),
    PRIMARY KEY(`id`)
    ) ENGINE=MYISAM;
    

    和 PHP 代码(使用 PDO):

    <?php
    $db = new PDO('mysql:dbname=test;host=localhost:4040','xxx','xxxx');
    
    $_BIN=pack('I*', 3563547,6587568,5468456,6458568,4568568);
    
    $rs = $db->prepare("INSERT INTO `binary`(`ba`) VALUES(?)");
    
    $rs->execute(array($_BIN));
    

    更新

    根据您建议的带有命名参数的代码,请参见下面的代码:

    <?php
    $_SNB = 23;
    $_USR = "toto";
    $_BIN = pack('I*', 24325, 2556456, 547577, 675746, 535646, 4564575, 575474, 4735);
    
    $db = new PDO('mysql:host=localhost:4040;dbname=test','xxxx','xxxx');
    $db->exec('SET CHARACTER SET utf8');
    $rs = $db->prepare("INSERT INTO `spw_license` (`serial_num`, `user`, `ba_struct`) 
                      VALUES(:serial_num, :username, :ba_struct)");
    
    $rs->bindValue(':serial_num', $_SNB, PDO::PARAM_INT);
    $rs->bindValue(':username', $_USR);
    $rs->bindValue(':ba_struct', $_BIN, PDO::PARAM_LOB);
    
    try {
        if(!$rs->execute()) {
            var_dump($db->errorInfo());
        }
    } catch(Exception $e) {
        echo 'got Exception: ' . $e->getMessage() . PHP_EOL;
    }
    

    这是启动后表格的样子:

    mysql> select * from `spw_license`;
    +------------+------+----------------------------------+
    | serial_num | user | ba_struct                        |
    +------------+------+----------------------------------+
    |         23 | toto | ♣_  (☻' ∙ вO
     ^ _жE Є ⌂↕   |
    +------------+------+----------------------------------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 非常感谢 Alexy,但在所有其他代码中,我没有使用 PDO,我不知道这是否真的是现在最好的做法,并更改所有其他代码。我想我需要在 MySql 中做
    • 然后尝试 $strSQL = spintf("INSERT INTO table_name (id, ba) VALUES($id, '%s')",mysql_real_escape_string($_BIN));
    • 错误是什么?您可以安装 mysql-proxy 并通过它进行连接,并使用您在 mysql-proxy 中看到的查询来更新您的问题吗?
    • 嗨,Alexy,我尝试使用 PDO 编写查询,但我在数据库中得到的是我在表列上的数据的十六进制表示,而不是真正的二进制数据
    • 你用mysql CLI客户端检查过它真的是十六进制吗?还是其他客户?如果你在 php PDO 中选择(相同的脚本),它会是十六进制的吗?
    猜你喜欢
    • 2017-07-25
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多