Как объяснил scompt.com , запрос может завершиться ошибкой. Используйте этот код, чтобы получить ошибку запроса или правильный результат:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("
SELECT * FROM Users
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");
if($result)
{
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
} else {
echo 'Invalid query: ' . mysql_error() . "\n";
echo 'Whole query: ' . $query;
}
Для получения дополнительной информации см. Документацию для mysql_query()
.
Фактической ошибкой были одиночные кавычки, так что переменная $username
не анализировалась. Но вы действительно должны использовать mysql_real_escape_string($username)
, чтобы избежать инъекций SQL.
Создайте это встроенное удовольствие:
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
, а затем вы можете вызвать его следующим образом:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
ПРИМЕЧАНИЕ. Этот подход не был возможен раньше в старом плагине kotlin версии, но теперь вы можете использовать его.
Предыдущие альтернативы:
АЛЬТЕРНАТИВА 1:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Вы должны положить object :
и конкретный тип в fromJson<List<Turns>>
Альтернативный вариант 2:
Как @cypressious упомянуть, что может быть достигнуто также таким образом:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
использовать как:
val turnsType = genericType<List<Turns>>()
val obj: MutableList<SaleItemResponse> = Gson().fromJson(messageAfterDecrypt,
object : TypeToken<List<SaleItemResponse>>() {}.type)
Это мой способ анализа массива данных в kotlin.
Это работает также и проще
inline fun <reified T> Gson.fromJson(json: String) : T =
this.fromJson<T>(json, T::class.java)
Я использовал что-то вроде этого, чтобы преобразовать T
в string
& amp; String
вернуться к T
с помощью Gson
. Не все, что вы ищете, но на всякий случай.
Объявление расширения
blockquote>inline fun <reified T : Any> T.json(): String = Gson().toJson(this, T::class.java) inline fun <reified T : Any> String.fromJson(): T = Gson().fromJson(this,T::class.java)
Использование
blockquote>// Passing an object to new Fragment companion object { private const val ARG_SHOP = "arg-shop" @JvmStatic fun newInstance(shop: Shop) = ShopInfoFragment().apply { arguments = Bundle().apply { putString(ARG_SHOP, shop.json()) } } } // Parsing the passed argument private lateinit var shop: Shop override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { shop = it.getString(ARG_SHOP).fromJson() ?: return } }
Это решает проблему:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Первая строка создает выражение object , которое спускается с TypeToken
, а затем получает Java Type
. Тогда методу Gson().fromJson
нужен либо тип, указанный для результата функции (который должен соответствовать созданному TypeToken
). Две версии этой работы, как указано выше, или:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Чтобы упростить создание TypeToken
, вы можете создать вспомогательную функцию, которая должна быть inline так что он может использовать параметры reified type :
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
, который затем может быть использован одним из следующих способов:
val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()
И весь процесс может быть завернут в функцию расширения для экземпляра Gson
:
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
Чтобы вы могли просто позвонить Gson и не беспокоиться о TypeToken
вообще:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Здесь Котлин использует вывод типа с одной стороны задания или другой, и генерирует обобщенные данные для встроенной функции для прохождения через полный тип (без стирания) и используя это для построения TypeToken
, а также делает звоните в Gson
Другой вариант (не уверен, что он выглядит более элегантным, чем другие) может быть вызовом следующим образом:
turns = Gson().fromJson(allPurchasesString, Array<Turns>::class.java).toMutableList()
Таким образом, вы используете линейку класса java Array класса, а не «чистый Kotlin».