mysql在将.png图像作为blob插入时报告语法错误

7jmck4yq  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(314)

我正在游戏中开发一个角色编辑器,使用php与mysql数据库进行unity通信。
在玩家编辑他们的角色后,我用新的纹理和唯一的id更新db。我从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();

然后,我发送了一个请求 idAlumno , idAvatar ,和 binary 处理与数据库交互的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\u unicode\u ci,尽管我已经尝试过简单地使用utf8来获得相同或相似的结果。
我也试过用 addslashes() , mysqli::real_escape_string() ,或它们的组合,甚至使用 fopen() 以及 fread() 将临时文件保存到硬盘后。所有这些都会导致相同的错误

yyyllmsg

yyyllmsg1#

见下表:

$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或其他一些db库。无论哪种方式,都要确保查询中的每个值都是从白名单中提取的,或者是转义的。

相关问题