用php和MS SQL存储pdf到varbinary(max)字段


Storing pdf to varbinary(max) field with php and MS SQL

我正在使用MS SQL 2005和PHP,我得到了这个代码

move_uploaded_file($_FILES["file"]["tmp_name"],"temp/" . $_FILES["file"]["name"]);
$data = fopen("temp/"$_FILES["file"]["name"], "rb");
$content =fread($data,$_FILES['file']['size']);
$content=addslashes($content);
$sql = "INSERT INTO docs(file) value($content)";
if(!mssql_query($sql)){
    die('MSSQL error: ' . mssql_get_last_message());
}

,我得到了这个错误:MSSQL错误:"PDF"附近语法不正确

PD:原谅我的英语不好


我找到了解决方案:代码看起来像:

function mssql_escape($data) {
    if(is_numeric($data))
      return $data;
    $unpacked = unpack('H*hex', $data);
    return '0x' . $unpacked['hex'];
}

move_uploaded_file($_FILES["file"]["tmp_name"],"temp/" . $_FILES["file"]["name"]);
$data = fopen("temp/"$_FILES["file"]["name"], "rb");
$content =fread($data,$_FILES['file']['size']);
$content=mssql_escape($content);//Call mssql_escape function
$sql = "INSERT INTO docs(file) value($content)";
if(!mssql_query($sql)){
    die('MSSQL error: ' . mssql_get_last_message());
}

使用参数。请参阅文档-特别是mssql_bind的第一个示例-了解如何做到这一点。

您正在尝试将PDF文件的内容作为字符串插入,并且该字符串周围没有引号。但是即使你把$contents用引号括起来,它可能仍然不能工作。文件内容中可能存在不能用这种方式插入的二进制文件。

另外,将PDF文件保存在文件系统的某个位置并将文件的路径保存在数据库中可能更容易。这样你就不会有巨大的(兆字节!)记录在你的数据库中,文件可能会更快地访问。

我找到了解决方案:代码看起来像:

function mssql_escape($data) {
    if(is_numeric($data))
      return $data;
    $unpacked = unpack('H*hex', $data);
    return '0x' . $unpacked['hex'];
}

move_uploaded_file($_FILES["file"]["tmp_name"],"temp/" . $_FILES["file"]["name"]);
$data = fopen("temp/"$_FILES["file"]["name"], "rb");
$content =fread($data,$_FILES['file']['size']);
$content=mssql_escape($content);//Call mssql_escape function
$sql = "INSERT INTO docs(file) value($content)";
if(!mssql_query($sql)){
    die('MSSQL error: ' . mssql_get_last_message());
}