当将.png图像作为BLOB插入时,MySQL报告语法错误

时间:2018-07-04 15:17:57

标签: php mysql mysqli

我正在开发游戏中的角色编辑器,使用PHP来将Unity与MySQL数据库进行通信。

在玩家编辑了角色之后,我使用该角色的新纹理及其唯一ID更新了数据库。我像这样从Unity的C#收集这些参数:

string idAlumno = GameManager.Instance.usuario.Id.ToString();
string idAvatar = args.json["id"];
BinaryDataField binary = new BinaryDataField();
binary.fieldName = "imagenAvatar";
binary.contents = character.finalTexture.EncodeToPNG();

然后,我将带有idAlumnoidAvatarbinary的请求发送到一个PHP文件,该文件处理与数据库的交互,如下所示:

<?php
include ('conexion.php');

$idAlumno = $_POST['idAlumno'];
$idAvatar = $_POST['idAvatar'];
$imagenAvatar = file_get_contents($_FILES['imagenAvatar']['tmp_name']);

$query = "UPDATE alumnos SET idAvatar = {$idAvatar}, imagenAvatar = {$imagenAvatar} WHERE idAlumno = {$idAlumno}";

$return = array ();

if ( !$mysqli->query($query) ) {
    die("Error: {$mysqli->errno}; {$mysqli->error}; Query -> {$query}");
}

$return['id'] = $mysqli->insert_id;

echo json_encode($return);

此报告:

Error: 1064; You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' ' at line 2

查询如下:

UPDATE alumnos SET idAvatar = 69, imagenAvatar = �PNG  IHDR+� IDATx�y�$�}&��u]]}��=G3�$n�(J$�X���V+i�c-��^{�v��P����6$Y)-I��(�)�$H� ��`L�=}��u���UeuvOY�U�u��Lvfe����^���{�����jA@A@A@A��0Z�y�:A@A@A@A@ "�~ �� �� �� �"h��,MA@A@A@D }@A@A@A@hD�/Y�(�� �� �� �@�� �� �� �� ��� ^�4QA@A@A@��A@A@A@A� @�di� �� �� �� ��� �� �� �@ 

...以及一堆额外的奇怪字符填充行。

这对我来说很奇怪,因为我尝试从PhpMyAdmin编辑blob,结果查询看起来更加整洁:

UPDATE `alumnos` SET `imagenAvatar` = 0x89504e470d0a1a0a0000000d4948445200000400000004[...]

我尝试保存返回的图片

file_get_contents($_FILES['imagenAvatar']['tmp_name']);

它已保存并正确显示在我的硬盘中,因此这使我认为在查询之前或查询期间如何处理文件存在某种问题,但是我找不到它是什么

我的数据库中当前的排序规则是utf8md4_unicode_ci,尽管我已经尝试过使用具有相同或相似结果的简单utf8。


在将临时文件保存到硬盘后,我还尝试使用addslashes()mysqli::real_escape_string()或它们的组合,甚至尝试使用fopen()fread() 。所有这些总是导致相同的错误

1 个答案:

答案 0 :(得分:-1)

参见下文:

$idAlumno = $_POST['idAlumno']; // escape this or cast to int!
$idAvatar = $_POST['idAvatar']; // escape this or cast to int!
$imagenAvatar = file_get_contents($_FILES['imagenAvatar']['tmp_name']);
$imagenAvatar = bin2hex($imagenAvatar);
$query = "UPDATE alumnos SET idAvatar = {$idAvatar}, imagenAvatar = 0x{$imagenAvatar} WHERE idAlumno = {$idAlumno}";

请注意十六进制字符串前面的0x

与您的问题无关,但也许与您的项目有关,您可能需要重新考虑在数据库中存储图像。也许您可以将它们保存在目录中,然后存储路径。

您可能还希望切换为使用PDO或其他一些数据库库。无论哪种方式,请确保查询中的每个值都从白名单中提取或转义。