Php 有没有办法将UMA头像配方**包括转义字符**保存到我的数据库中?

Php 有没有办法将UMA头像配方**包括转义字符**保存到我的数据库中?,php,mysql,unity3d,Php,Mysql,Unity3d,在统一中,我有一个UMA角色创造者 最后,它给了我一个化身配方,让我加载保存的角色 我想将这个化身配方保存到我的mysql数据库中 因此,我将配方传递给服务器上存储的进程,并尝试保存它,但它不会加载,因为转义字符已被删除 以下是一个例子: 这是一个有效的UMA配方: {"packedRecipeType":"DynamicCharacterAvatar","name":"Player","race"

在统一中,我有一个UMA角色创造者

最后,它给了我一个化身配方,让我加载保存的角色

我想将这个化身配方保存到我的mysql数据库中

因此,我将配方传递给服务器上存储的进程,并尝试保存它,但它不会加载,因为转义字符已被删除

以下是一个例子:

这是一个有效的UMA配方:

{"packedRecipeType":"DynamicCharacterAvatar","name":"Player","race":"HumanMaleDCS","dna":[{"dnaType":"DynamicUMADna","dnaTypeHash":815443803,"packedDna":"{\"bDnaAsset\":{\"instanceID\":26992},\"bDnaAssetName\":\"HumanMaleDynamicDnaAsset\",\"bDnaSettings\":[{\"name\":\"skinGreenness\",\"value\":128}, etc... it goes on like that for a long time
但在我的数据库中,它看起来是这样的:

{"packedRecipeType":"DynamicCharacterAvatar","name":"Player","race":"HumanMaleDCS","dna":[{"dnaType":"DynamicUMADna","dnaTypeHash":815443803,"packedDna":"{"bDnaAsset":{"instanceID":26992},"bDnaAssetName":"HumanMaleDynamicDnaAsset","bDnaSettings":[{"name":"skinGreenness","value":128}, etc..
这里是关键的区别
“bDnaAssetName\”
变为
“bDnaAssetName”
\'HumanMaleDynamicDNA资产\
变为
“HumanMaleDynamicDNA资产”
等等

消失了

因此:

  • 我是否可以保存此字符串及其所有反斜杠,以便在重新加载它时它可以工作

  • 这是个好主意吗?我是在自找麻烦吗?有没有更好的方法将UMA配方保存到我的数据库中


  • 我最终通过使用PHP
    addslashes()

    下面是帖子的内容

    $Recipe = addslashes($_POST["Recipe"]);
    
    //Query DB
    $qry = "UPDATE player SET AvatarRecipe = '$Recipe' WHERE ID = '$PlayerID' ";
            
    

    现在它以一种形式保存到数据库中,UMA可以在我加载头像时读取它。

    我最终通过使用PHP
    addslashes()

    下面是帖子的内容

    $Recipe = addslashes($_POST["Recipe"]);
    
    //Query DB
    $qry = "UPDATE player SET AvatarRecipe = '$Recipe' WHERE ID = '$PlayerID' ";
            
    

    现在它以一种形式保存到数据库中,UMA可以在我加载化身时读取它。

    我在postgresql中将配方保存为json字段时遇到了类似的问题。问题来自UMA开发人员在json中包装json。它本质上是一个嵌套的json字符串,只会导致问题。我几个月前就告诉了他们,并发布了一些代码来帮助他们,但我认为他们从未更新过

    在任何情况下,我的代码都将通过将配方的外部json转换为泛型来评估问题的根源,而不考虑内部json。这仍然有点像黑客,因为我必须再次嵌套json才能加载菜谱。以下是代码,您可以将其放在资产文件夹的任何位置:

    // Brought to you by Tarball 5/28/2019
    // Drop in Asset folder to save your UMA data to generic types
    // Call public methods from any script
    
    using UMA.CharacterSystem;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace UMA
    {
        namespace EasyMode
        {
            public static class EasyUMA
            {
                public static List<UMAPackedRecipeBase.UMAPackedDna> dnaPackedRecipe = new List<UMAPackedRecipeBase.UMAPackedDna>();
                public static UMAPackedRecipeBase.UMAPackedDna packedDna = new UMAPackedRecipeBase.UMAPackedDna();
                public static Dictionary<int, Dictionary<string, string>> DNAInfo = new Dictionary<int, Dictionary<string, string>>();
                public static Dictionary<string, short[]> colorRecipe = new Dictionary<string, short[]>();
                public static Dictionary<string, string> wardrobeRecipe = new Dictionary<string, string>();
                public static UMATextRecipe.DCSPackRecipe totalRecipe = new UMATextRecipe.DCSPackRecipe();
                public static bool saveAsMale;
                public static string[] colorNames;
                public static short[][] colorData;
    
                private static DynamicCharacterAvatar.SaveOptions saveOptions = DynamicCharacterAvatar.SaveOptions.saveDNA
                        | DynamicCharacterAvatar.SaveOptions.saveColors | DynamicCharacterAvatar.SaveOptions.saveWardrobe;
    
                private static Dictionary<string, string> wardrobe_slots = new Dictionary<string, string>();
                private static Dictionary<string, short[]> UMA_colors = new Dictionary<string, short[]>();
                private static List<UMAPackedRecipeBase.UMAPackedDna> dnaList = new List<UMAPackedRecipeBase.UMAPackedDna>();
    
                // Returns the current DCSPackRecipe from a DynamicCharacterAvatar
                private static UMATextRecipe.DCSPackRecipe packedRecipe(DynamicCharacterAvatar currentAvatar)
                {
                    if (currentAvatar != null)
                    {
                        return new UMATextRecipe.DCSPackRecipe(currentAvatar, currentAvatar.name, "DynamicCharacterAvatar", saveOptions);
                    }
                    else return null;
                }
    
                /// <summary>
                /// Returns a Dictionary with raw DNA information for saving in c# generic types
                /// </summary>
                public static Dictionary<int, Dictionary<string, string>> PrintDNADictionary(DynamicCharacterAvatar dynamicCharacterAvatar)
                {
                    if (dynamicCharacterAvatar != null)
                    {
                        dnaList = packedRecipe(dynamicCharacterAvatar).dna;
                        if (dnaList != null && dnaList.Count != 0)
                        {
                            Dictionary<string, string> tempStrings = new Dictionary<string, string>();
                            Dictionary<int, Dictionary<string, string>> tempDict = new Dictionary<int, Dictionary<string, string>>();
                            tempStrings.Add(dnaList.First().dnaType, dnaList.First().packedDna);
                            tempDict.Add(dnaList.First().dnaTypeHash, tempStrings);
                            return tempDict;
                        }
                        else return null;
                    }
                    else return null;
                }
    
                /// <summary>
                /// Returns a Dictionary with wardrobe information in the format: (string wardrobe_slot_name, string wardrobe_item_name), for example ("Chest", "BreastPlate001")
                /// </summary>
                public static Dictionary<string, string> PrintWardrobe(DynamicCharacterAvatar dynamicCharacterAvatar)
                {
                    if (dynamicCharacterAvatar != null)
                    {
                        var recipe = packedRecipe(dynamicCharacterAvatar);
                        wardrobe_slots.Clear();
                        foreach (WardrobeSettings wardrobe_item in recipe.wardrobeSet)
                        {
                            wardrobe_slots.Add(wardrobe_item.slot, wardrobe_item.recipe);
                        }
                        return wardrobe_slots;
                    }
                    else return null;
                }
    
                /// <summary>
                /// Returns a Dictionary with shared color information (string color_name, short[] RGBA_numbers)
                /// </summary>
                public static Dictionary<string, short[]> PrintColors(DynamicCharacterAvatar dynamicCharacterAvatar)
                {
                    if (dynamicCharacterAvatar != null)
                    {
                        var recipe = packedRecipe(dynamicCharacterAvatar);
                        colorNames = new string[recipe.characterColors.Count];
                        colorData = new short[recipe.characterColors.Count][];
                        int i = 0;
                        UMA_colors.Clear();
                        foreach (UMAPackedRecipeBase.PackedOverlayColorDataV3 charColors in recipe.characterColors)
                        {
                            UMA_colors.Add(charColors.name, charColors.colors);
                            colorNames[i] = charColors.name;
                            colorData[i] = charColors.colors;
                            i++;
                        }
                        return UMA_colors;
                    }
                    else return null;
                }
    
                /// <summary>
                /// Returns the full recipe as a DCSPackRecipe 
                /// </summary>
                public static UMATextRecipe.DCSPackRecipe gatherFullRecipe(DynamicCharacterAvatar currentAvatar, bool isMale,
                    Dictionary<int, Dictionary<string, string>> DNAInfo, Dictionary<string, short[]> colorsData, Dictionary<string, string> wardrobeData)
                {
                    UMATextRecipe.DCSPackRecipe recipe = new UMATextRecipe.DCSPackRecipe();
                    UMAPackedRecipeBase.UMAPackedDna item = new UMAPackedRecipeBase.UMAPackedDna();
                    if (DNAInfo != null && DNAInfo.Count != 0)
                    {
                        item.dnaTypeHash = DNAInfo.First().Key;
                        item.dnaType = DNAInfo.First().Value.First().Key;
                        item.packedDna = DNAInfo.First().Value.First().Value;
                        List<UMAPackedRecipeBase.UMAPackedDna> senselessList = new List<UMAPackedRecipeBase.UMAPackedDna>();
                        senselessList.Add(item);
                        recipe.dna = senselessList;
                    }
    
                    if (isMale)
                        recipe.race = "HumanMale";
                    else recipe.race = "HumanFemale";
    
                    if (colorsData != null && colorsData.Count != 0)
                    {
                        UMAPackedRecipeBase.PackedOverlayColorDataV3[] overlays = new UMAPackedRecipeBase.PackedOverlayColorDataV3[colorsData.Count];
                        recipe.characterColors = new List<UMAPackedRecipeBase.PackedOverlayColorDataV3>();
                        int i = 0;
                        foreach (var uniqueColor in colorsData)
                        {
                            overlays[i] = new UMAPackedRecipeBase.PackedOverlayColorDataV3();
                            overlays[i].name = uniqueColor.Key;
                            overlays[i].colors = uniqueColor.Value;
                            recipe.characterColors.Add(overlays[i]);
                            i++;
                        }
                    }
    
                    if (wardrobeData != null && wardrobeData.Count != 0)
                    {
                        WardrobeSettings[] wardrobeInfo = new WardrobeSettings[wardrobeData.Count];
                        recipe.wardrobeSet = new List<WardrobeSettings>();
                        int i = 0;
                        foreach (var wardrobePiece in wardrobeData)
                        {
                            wardrobeInfo[i] = new WardrobeSettings();
                            wardrobeInfo[i].slot = wardrobePiece.Key;
                            wardrobeInfo[i].recipe = wardrobePiece.Value;
                            recipe.wardrobeSet.Add(wardrobeInfo[i]);
                            i++;
                        }
                    }
                    return recipe;
                }
            }
        }
    }
    

    在postgresql中将菜谱保存为json字段时,我遇到了类似的问题。问题来自UMA开发人员在json中包装json。它本质上是一个嵌套的json字符串,只会导致问题。我几个月前就告诉了他们,并发布了一些代码来帮助他们,但我认为他们从未更新过

    在任何情况下,我的代码都将通过将配方的外部json转换为泛型来评估问题的根源,而不考虑内部json。这仍然有点像黑客,因为我必须再次嵌套json才能加载菜谱。以下是代码,您可以将其放在资产文件夹的任何位置:

    // Brought to you by Tarball 5/28/2019
    // Drop in Asset folder to save your UMA data to generic types
    // Call public methods from any script
    
    using UMA.CharacterSystem;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace UMA
    {
        namespace EasyMode
        {
            public static class EasyUMA
            {
                public static List<UMAPackedRecipeBase.UMAPackedDna> dnaPackedRecipe = new List<UMAPackedRecipeBase.UMAPackedDna>();
                public static UMAPackedRecipeBase.UMAPackedDna packedDna = new UMAPackedRecipeBase.UMAPackedDna();
                public static Dictionary<int, Dictionary<string, string>> DNAInfo = new Dictionary<int, Dictionary<string, string>>();
                public static Dictionary<string, short[]> colorRecipe = new Dictionary<string, short[]>();
                public static Dictionary<string, string> wardrobeRecipe = new Dictionary<string, string>();
                public static UMATextRecipe.DCSPackRecipe totalRecipe = new UMATextRecipe.DCSPackRecipe();
                public static bool saveAsMale;
                public static string[] colorNames;
                public static short[][] colorData;
    
                private static DynamicCharacterAvatar.SaveOptions saveOptions = DynamicCharacterAvatar.SaveOptions.saveDNA
                        | DynamicCharacterAvatar.SaveOptions.saveColors | DynamicCharacterAvatar.SaveOptions.saveWardrobe;
    
                private static Dictionary<string, string> wardrobe_slots = new Dictionary<string, string>();
                private static Dictionary<string, short[]> UMA_colors = new Dictionary<string, short[]>();
                private static List<UMAPackedRecipeBase.UMAPackedDna> dnaList = new List<UMAPackedRecipeBase.UMAPackedDna>();
    
                // Returns the current DCSPackRecipe from a DynamicCharacterAvatar
                private static UMATextRecipe.DCSPackRecipe packedRecipe(DynamicCharacterAvatar currentAvatar)
                {
                    if (currentAvatar != null)
                    {
                        return new UMATextRecipe.DCSPackRecipe(currentAvatar, currentAvatar.name, "DynamicCharacterAvatar", saveOptions);
                    }
                    else return null;
                }
    
                /// <summary>
                /// Returns a Dictionary with raw DNA information for saving in c# generic types
                /// </summary>
                public static Dictionary<int, Dictionary<string, string>> PrintDNADictionary(DynamicCharacterAvatar dynamicCharacterAvatar)
                {
                    if (dynamicCharacterAvatar != null)
                    {
                        dnaList = packedRecipe(dynamicCharacterAvatar).dna;
                        if (dnaList != null && dnaList.Count != 0)
                        {
                            Dictionary<string, string> tempStrings = new Dictionary<string, string>();
                            Dictionary<int, Dictionary<string, string>> tempDict = new Dictionary<int, Dictionary<string, string>>();
                            tempStrings.Add(dnaList.First().dnaType, dnaList.First().packedDna);
                            tempDict.Add(dnaList.First().dnaTypeHash, tempStrings);
                            return tempDict;
                        }
                        else return null;
                    }
                    else return null;
                }
    
                /// <summary>
                /// Returns a Dictionary with wardrobe information in the format: (string wardrobe_slot_name, string wardrobe_item_name), for example ("Chest", "BreastPlate001")
                /// </summary>
                public static Dictionary<string, string> PrintWardrobe(DynamicCharacterAvatar dynamicCharacterAvatar)
                {
                    if (dynamicCharacterAvatar != null)
                    {
                        var recipe = packedRecipe(dynamicCharacterAvatar);
                        wardrobe_slots.Clear();
                        foreach (WardrobeSettings wardrobe_item in recipe.wardrobeSet)
                        {
                            wardrobe_slots.Add(wardrobe_item.slot, wardrobe_item.recipe);
                        }
                        return wardrobe_slots;
                    }
                    else return null;
                }
    
                /// <summary>
                /// Returns a Dictionary with shared color information (string color_name, short[] RGBA_numbers)
                /// </summary>
                public static Dictionary<string, short[]> PrintColors(DynamicCharacterAvatar dynamicCharacterAvatar)
                {
                    if (dynamicCharacterAvatar != null)
                    {
                        var recipe = packedRecipe(dynamicCharacterAvatar);
                        colorNames = new string[recipe.characterColors.Count];
                        colorData = new short[recipe.characterColors.Count][];
                        int i = 0;
                        UMA_colors.Clear();
                        foreach (UMAPackedRecipeBase.PackedOverlayColorDataV3 charColors in recipe.characterColors)
                        {
                            UMA_colors.Add(charColors.name, charColors.colors);
                            colorNames[i] = charColors.name;
                            colorData[i] = charColors.colors;
                            i++;
                        }
                        return UMA_colors;
                    }
                    else return null;
                }
    
                /// <summary>
                /// Returns the full recipe as a DCSPackRecipe 
                /// </summary>
                public static UMATextRecipe.DCSPackRecipe gatherFullRecipe(DynamicCharacterAvatar currentAvatar, bool isMale,
                    Dictionary<int, Dictionary<string, string>> DNAInfo, Dictionary<string, short[]> colorsData, Dictionary<string, string> wardrobeData)
                {
                    UMATextRecipe.DCSPackRecipe recipe = new UMATextRecipe.DCSPackRecipe();
                    UMAPackedRecipeBase.UMAPackedDna item = new UMAPackedRecipeBase.UMAPackedDna();
                    if (DNAInfo != null && DNAInfo.Count != 0)
                    {
                        item.dnaTypeHash = DNAInfo.First().Key;
                        item.dnaType = DNAInfo.First().Value.First().Key;
                        item.packedDna = DNAInfo.First().Value.First().Value;
                        List<UMAPackedRecipeBase.UMAPackedDna> senselessList = new List<UMAPackedRecipeBase.UMAPackedDna>();
                        senselessList.Add(item);
                        recipe.dna = senselessList;
                    }
    
                    if (isMale)
                        recipe.race = "HumanMale";
                    else recipe.race = "HumanFemale";
    
                    if (colorsData != null && colorsData.Count != 0)
                    {
                        UMAPackedRecipeBase.PackedOverlayColorDataV3[] overlays = new UMAPackedRecipeBase.PackedOverlayColorDataV3[colorsData.Count];
                        recipe.characterColors = new List<UMAPackedRecipeBase.PackedOverlayColorDataV3>();
                        int i = 0;
                        foreach (var uniqueColor in colorsData)
                        {
                            overlays[i] = new UMAPackedRecipeBase.PackedOverlayColorDataV3();
                            overlays[i].name = uniqueColor.Key;
                            overlays[i].colors = uniqueColor.Value;
                            recipe.characterColors.Add(overlays[i]);
                            i++;
                        }
                    }
    
                    if (wardrobeData != null && wardrobeData.Count != 0)
                    {
                        WardrobeSettings[] wardrobeInfo = new WardrobeSettings[wardrobeData.Count];
                        recipe.wardrobeSet = new List<WardrobeSettings>();
                        int i = 0;
                        foreach (var wardrobePiece in wardrobeData)
                        {
                            wardrobeInfo[i] = new WardrobeSettings();
                            wardrobeInfo[i].slot = wardrobePiece.Key;
                            wardrobeInfo[i].recipe = wardrobePiece.Value;
                            recipe.wardrobeSet.Add(wardrobeInfo[i]);
                            i++;
                        }
                    }
                    return recipe;
                }
            }
        }
    }