我正在开发游戏中的角色编辑器,使用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();
然后,我将带有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_unicode_ci,尽管我已经尝试过使用具有相同或相似结果的简单utf8。
在将临时文件保存到硬盘后,我还尝试使用addslashes()
,mysqli::real_escape_string()
或它们的组合,甚至尝试使用fopen()
和fread()
。所有这些总是导致相同的错误
答案 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或其他一些数据库库。无论哪种方式,请确保查询中的每个值都从白名单中提取或转义。