Получить значения из таблицы базы данных с идентификатором из Unity

#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 На самом деле вам вообще не следует больше пользоваться .. это наследие и устаревшее .. вместо этого вам следует использовать a UnityWebRequest.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 на самом деле вы вообще не должны больше использовать .. это наследие и устаревшее .. вместо этого вам следует использовать a UnityWebRequest.Post и в php $_POST['id'] … аааа и ну здравствуй SQL-ИНЪЕКЦИЯ!! -> > Вместо этого используйте подготовленные заявления!! .. PHP OP абсолютно опасен и все, кроме хорошего 😉

2. @derHugo О, понял, я должен был использовать WebRequest вместо этого, но просто набрал его на мобильном телефоне. Я могу переписать сообщение, используя обновленный класс, и могу использовать подготовленные инструкции. Я не был уверен в масштабах игры ОП, но следует придерживаться наилучшей практики, особенно если это связано с безопасностью. Я могу немного обновить сообщение — просто сейчас меня нет дома.

3. @derHugo Хорошо обновил фрагменты — оставил старые, чтобы показать, чего не следует делать.