#php #sql #unity3d
Вопрос:
У меня есть таблица базы данных со значениями, первичным ключом которой является идентификатор. Теперь я пытаюсь получить значения таблицы со ссылочным идентификатором из Unity. Как мне отправить указанный идентификатор из Unity в этот php-файл, чтобы получать только значения из этого идентификатора.
В настоящее время я получаю все значения таблицы из всех идентификаторов.
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class CheckForExistingID : MonoBehaviour {
public string[] Items;
public string ID = "001"; //Referenced ID
public string Name;
public string Age;
void Start () {
StartCoroutine (ReceiveValues());
}
IEnumerator ReceiveValues () {
WWW data = new WWW ("http://localhost/GetValue.php?id=" ID);
yield return data;
if (data.error != null) {
print (data.error);
} else {
print ("Received");
dataString = data.text;
Items = dataString.Split (';');
Name = Items[0];
Age = Items[1];
}
}
}
GetValue.php
<?php
...
...
...
$id = $_GET['id'];
$sql = "SELECT Name, Age FROM Students WHERE ID = $id";
$result = mysqli_query($conn, $sql);
if(mysqli_num_rows($result) > 0)
{
while($row = mysqli_fetch_assoc($result)){
echo "".$row['Name'] . ";";
echo "".$row['Age'] . ";";
}
}
?>
Комментарии:
1.
WWW
На самом деле вам вообще не следует больше пользоваться .. это наследие и устаревшее .. вместо этого вам следует использовать aUnityWebRequest.Post
и в php$_POST['id']
… аааа и ну здравствуй SQL-ИНЪЕКЦИЯ!! -> > Вместо этого используйте подготовленные заявления!!
Ответ №1:
ПРИМЕЧАНИЕ.НЕ используйте WWW, как указывал Деруго, он теперь устарел. Аналогичным образом очистите все данные, используя подготовленные инструкции. Перейдите к маркеру редактирования, чтобы найти обновленный ответ.
Я не уверен, что вы размещаете данные должным образом. Вы должны использовать a WWWForm
, добавить нужные поля, а затем обработать их на стороне PHP. Я бы также серьезно рассмотрел возможность добавления какой-либо формы обработки ошибок в PHP с помощью эха, чтобы узнать, не произошло ли что-то не так.
На мобильном телефоне, так что извините за форматирование, я исправлю его позже, если это понадобится.
string url = "http://localhost/GetValue.php";
WWWForm form = new WWWForm();
form.AddField("id", "TheIDHere");
WWW www = new WWW(url, form);
yield return www;
...
С точки зрения PHP, это может выглядеть так
<?php
if (isset($_REQUEST["id"])) {
echo "Received ". $_REQUEST["id"]. " success!";
exit();
} else {
http_status_code(400);
echo "Request Failed";
}
Редактировать: Как указал Деруго, WWW
теперь устарел и заменен на WebRequests
. Приведенный выше код c# должен выглядеть следующим образом
WWWForm form = new WWWForm();
form.AddField("id", "yourID");
UnityWebRequest www = UnityWebRequest.Post("http://localhost/GetValue.php", form);
yield return www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
Debug.Log(www.error);
}
else
{
Debug.Log("Sucess");
}
Кроме того, Деруго указал, что вы вообще не очищаете свои данные, поэтому вы будете подвержены SQL-инъекциям. Вот примерно то, что вы хотели бы сделать, чтобы использовать подготовленные заявления
// prepare a statement using the ID
$stmt = $mysqli->prepare("SELECT Name, Age FROM Students WHERE ID = ?");
// bind the ID from our POST
$stmt->bind_param("i", $_POST['id']);
// execute our prepare statement
$stmt->execute();
// store the result
$stmt->store_result();
// we have no found id
if($stmt->num_rows === 0) exit('No Data');
// bind the results we are looking for from our prepared statement
$stmt->bind_result($idName, $idAge);
// fetch the results from the table
$stmt->fetch();
// echo your results to Unity
echo $idName;
echo $idAge;
// deallocate the statement
$stmt->close();
Комментарии:
1. OP использует
GET
поля URL-адреса, что теоретически нормально … ноWWW
на самом деле вы вообще не должны больше использовать .. это наследие и устаревшее .. вместо этого вам следует использовать aUnityWebRequest.Post
и в php$_POST['id']
… аааа и ну здравствуй SQL-ИНЪЕКЦИЯ!! -> > Вместо этого используйте подготовленные заявления!! .. PHP OP абсолютно опасен и все, кроме хорошего 😉2. @derHugo О, понял, я должен был использовать
WebRequest
вместо этого, но просто набрал его на мобильном телефоне. Я могу переписать сообщение, используя обновленный класс, и могу использовать подготовленные инструкции. Я не был уверен в масштабах игры ОП, но следует придерживаться наилучшей практики, особенно если это связано с безопасностью. Я могу немного обновить сообщение — просто сейчас меня нет дома.3. @derHugo Хорошо обновил фрагменты — оставил старые, чтобы показать, чего не следует делать.