我在用PHP编写代码时遇到了一个小问题,如何使用MySQL 提供的数据来获得这个结果
{"profiles":[
{"ID": "39780b57-9181-4a41-a31e-5d4b3fa59a50", "Name": "Mihai - BP Dev Team","CountryCode": "ro","PictureID": "a30d750a-38e6-407f-a722-943fe3711807","IsStandard": true,"IsOnline": true,"IsPremium": true,"IsVerified": true,"Age": 27,"CityStateCode": "Bucharest"},
{"ID": "e1dd5bab-1eeb-4729-a4f6-0baeb851f750", "Name": "Nicolai", "CountryCode": "dk", "PictureID": "af1345b5-8380-4300-abf0-1d5f15c90040", "IsStandard": true, "Age": 32, "CityStateCode": "Valby"},
{"ID": "2c8535ec-25a4-4a3e-a333-c3797aff491f", "Name": "Testing", "CountryCode": "ca", "PictureID": "ba44bf9b-1592-40a8-b60c-068603bfb9c1", "IsStandard": true, "Age": 30, "CityStateCode": "Centre-Sud North"}}
]}
这是我的PHP代码:
$accessDb = new Connexion("gaiurba_MyBD");
$connexion2 = $accessDb->openConnexion();
if ($query2 = $connexion2->prepare("SELECT u.UserName as UserName, u.PictureID as PictureID, u.CountryCode as CountryCode,
u.DateOfBirth as DateOfBirth, u.CityCode as CityCode, u.VerifiedTimestamp as VerifiedTimestamp,
u.OnlineStatus as OnlineStatus, u.IsPaying as IsPaying, u.StatusAvailableForDates as StatusAvailableForDates,
cc.$languageCode as CityStateCode, os.$languageCode as LabelOnlineStatus
FROM Users u
INNER JOIN CityCode cc ON u.CityCode = cc.id
INNER JOIN OnlineStatus os ON u.OnlineStatus = os.id
WHERE u.ID = ?")) {
$query2->bind_param('s', $id);
$query2->execute();
$query2->bind_result($UserName, $PictureID, $CountryCode, $DateOfBirth, $CityStateCode, $VerifiedTimestamp, $OnlineStatus, $IsPaying, $StatusAvailableForDates, $CityStateCode, $LabelOnlineStatus);
$query2->store_result();
$affected2 = $connexion2->affected_rows;
// TRACE
echo "[affected2 row 2 = $affected2]";
if ($affected2 == 1) {
while ($query2->fetch()) {
echo "[ID = $id - UserName = $UserName - PictureID = $PictureID - CountryCode = $CountryCode - DateOfBirth = $DateOfBirth - CityStateCode = $CityStateCode - VerifiedTimestamp = $VerifiedTimestamp - OnlineStatus = $OnlineStatus - IsPaying = $IsPaying - StatusAvailableForDates = $StatusAvailableForDates - CityStateCode = $CityStateCode - LabelOnlineStatus = $LabelOnlineStatus]";
}
} else {
$result = '{"exception":false,"success":false,"status":0,"message":"ERROR SQL Query : SELECT-ULL-ID Number of row !","confirmMessage":null,"html":null,"data":null}';
}
} else {
$result = '{"exception":false,"success":false,"status":0,"message":"ERROR SQL Query : SELECT-ULL-ID Number of row !","confirmMessage":null,"html":null,"data":null}';
}
我知道正确的代码在while($query2->fetch())条件下,因为我的echo看到了从BD读取的良好信息
echo json_encode($result);
请不要注意SELECT返回的数据和JSON字符串中的数据。我知道我必须在while循环中格式化一些数据才能得到正确的结果。
我只需要知道如何创建一个数组,为MySQL返回的每一行添加一个新数组。
谢谢你的帮助!
创建一个数组很简单:
$profiles = array();
或者只是
// Add an item. Array is created if $x didn't contain an array already.
$profiles[] = 'foo';
因此,要创建具有您喜欢的结构的对象,您需要一个具有包含表示行的对象数组的属性的对象。
您可以用与数组类似的方式创建一个简单的对象:只需开始分配属性。因此,要创建配置文件数组,只需对每一行执行以下操作:
$profile = null;
$profile->UserName = $UserName;
$profile->PictureID = $PictureID;
// Etc
也许您的数据库类支持将整行作为对象返回的方法,而不是将fetch()
与出站参数结合调用。这样,您就不需要自己创建对象,只需保存几行即可。
// Add profile object to array.
$profiles[] := $profile;
也许您的数据库类支持将整个数据集作为对象数组返回的方法。如果是这样,就不需要自己循环和构建数组。再保存几行代码。
然而,您已经构建了数组,之后,将其封装在另一个对象中,确切地说是profiles
属性。
$result = null;
$result->profiles = $profiles;
输出:
echo json_encode($result);
在开始分配属性之前,并不是严格需要创建一个变量null
,但它可以防止意外重用旧变量。特别是在循环中,这是必需的,否则您将只重新分配同一对象的属性,并多次将同一对象添加到数组中,从而导致不希望的结果(每一行都相同)。
不只是分配属性,您实际上可以在这样做之前创建一个对象:
$profile = new StdClass();
这有点冗长,因此可能有点可读性,就像使用array()
初始化空数组一样。这是个人品味的问题。