Возможный сценарий
Я не могу найти, где мой код поступил не так. Вот моя полная ошибка:
Ошибка анализа: ошибка синтаксиса, неожиданный T_VARIABLE в строке x
Что я пытаюсь
$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';
Ответ
Ошибка анализа: проблема с синтаксисом вашей программы, например, оставляя точку с запятой от конца инструкции или, как и в случае выше, пропускает оператор
.
.Простыми словами это синтаксическая ошибка, означающая, что в вашем коде есть что-то, что помешает правильному анализу и поэтому работает.
Что вам нужно сделать, так это внимательно проверить строки, где ошибка для любых простых ошибок.
Это сообщение об ошибке означает, что в строке x файла интерпретатор PHP ожидал увидеть открытую круглую скобку, но вместо этого он встретил нечто, называемое
T_VARIABLE
. Эта вещьT_VARIABLE
называетсяtoken
. Это способ интерпретации PHP-интерпретатора различных фундаментальных частей программ. Когда интерпретатор читает в программе, он переводит то, что вы написали, в список токенов. Где бы вы ни разместили переменную в своей программе, в списке интерпретатора есть токенT_VARIABLE
.Хорошо читается: Список токенов парсера
So убедитесь, что вы включили хотя бы
E_PARSE
в своемphp.ini
. Ошибки анализа не должны существовать в производственных сценариях.Я всегда рекомендовал добавить следующий оператор при кодировании:
error_reporting(E_ALL);
Также неплохо использовать среду IDE, которая позволит вам знать ошибки разбора при наборе текста. Вы можете использовать:
- NetBeans (прекрасный мир красоты, бесплатное программное обеспечение) (лучший, на мой взгляд)
- PhpStorm (дядя Гордон любит это: P, платный план, содержит проприетарное и бесплатное программное обеспечение)
- Eclipse (красота и зверь, бесплатное программное обеспечение)
Вопросы, относящиеся:
Вероятно, будет много способов выполнить это. Мое предложение к варианту использования/, Когда сделать это. С 3 столбцами это не слишком плохо.
Select Id,
Case When Col1 < Col2 And Col1 < Col3 Then Col1
When Col2 < Col1 And Col2 < Col3 Then Col2
Else Col3
End As TheMin
From YourTableNameHere
При использовании SQL 2005, можно сделать что-то аккуратное как это:
;WITH res
AS ( SELECT t.YourID ,
CAST(( SELECT Col1 AS c01 ,
Col2 AS c02 ,
Col3 AS c03 ,
Col4 AS c04 ,
Col5 AS c05
FROM YourTable AS cols
WHERE YourID = t.YourID
FOR
XML AUTO ,
ELEMENTS
) AS XML) AS colslist
FROM YourTable AS t
)
SELECT YourID ,
colslist.query('for $c in //cols return min(data($c/*))').value('.',
'real') AS YourMin ,
colslist.query('for $c in //cols return avg(data($c/*))').value('.',
'real') AS YourAvg ,
colslist.query('for $c in //cols return max(data($c/*))').value('.',
'real') AS YourMax
FROM res
Этот путь Вы не заблудились в таком количестве операторов:)
Однако это могло быть медленнее, чем другой выбор.
Это - Ваш выбор...
Если Вы в состоянии сделать хранимую процедуру, она могла бы взять массив значений, и Вы могли просто назвать это.
select *,
case when column1 < columnl2 And column1 < column3 then column1
when columnl2 < column1 And columnl2 < column3 then columnl2
else column3
end As minValue
from tbl_example
Это - грубая сила, но работы
select case when col1 <= col2 and col1 <= col3 then col1
case when col2 <= col1 and col2 <= col3 then col2
case when col3 <= col1 and col3 <= col2 then col3
as 'TheMin'
end
from Table T
..., потому что минута () работает только над одним столбцом а не через столбцы.
Вы могли также сделать это с запросом на объединение. Как число столбцов увеличиваются, необходимо было бы изменить запрос, но по крайней мере это будет прямая модификация.
Select T.Id, T.Col1, T.Col2, T.Col3, A.TheMin
From YourTable T
Inner Join (
Select A.Id, Min(A.Col1) As TheMin
From (
Select Id, Col1
From YourTable
Union All
Select Id, Col2
From YourTable
Union All
Select Id, Col3
From YourTable
) As A
Group By A.Id
) As A
On T.Id = A.Id
Лучший способ сделать, который является, вероятно не , чтобы сделать это - странно, что люди настаивают на том, чтобы хранить свои данные способом, которые требуют, чтобы SQL "гимнастика" извлек значимую информацию, когда существуют намного более легкие способы достигнуть желаемого результата, если Вы просто структурируете свою схему немного лучше:-)
право способ сделать, это, по-моему, должно иметь следующую таблицу:
ID Col Val
-- --- ---
1 1 3
1 2 34
1 3 76
2 1 32
2 2 976
2 3 24
3 1 7
3 2 235
3 3 3
4 1 245
4 2 1
4 3 792
с ID/Col
как первичный ключ (и возможно Col
как дополнительный ключ, в зависимости от Ваших потребностей). Тогда Ваш запрос становится простым select min(val) from tbl
, и можно все еще рассматривать отдельные 'старые столбцы' отдельно при помощи where col = 2
в других запросах. Это также допускает легкое расширение, должен число 'старых столбцов' расти.
Это делает Ваши запросы так намного легче. Общее руководство, которое я склонен использовать, если у Вас когда-нибудь есть что-то, что похоже на массив в строке базы данных, Вы, вероятно, делаете что-то не так и должны думать о реструктуризации данных.
<час> Однако, если бы по некоторым причинам Вы не можете изменение те столбцы, я предложил бы использовать, вставляют и обновляют триггеры и добавляют другой столбец, который эти триггеры установили на минимум на Col1/2/3
. Это переместит 'стоимость' операции далеко от выбора до обновления/вставления, где это принадлежит - большинство таблиц базы данных, по моему опыту, читается намного чаще, чем записанный настолько подвергающийся стоимости на записи, имеет тенденцию быть более эффективным со временем.
, Другими словами, минимум для строки только изменяется, когда одно из другого изменения столбцов, таким образом это , когда необходимо вычислять его, не каждый раз, когда Вы выбираете (который потрачен впустую, если данные не изменяются). Вы тогда закончили бы с таблицей как:
ID Col1 Col2 Col3 MinVal
-- ---- ---- ---- ------
1 3 34 76 3
2 32 976 24 24
3 7 235 3 3
4 245 1 792 1
Любая другая опция, которая должна принять решения в select
время, обычно является плохой мудрой производительностью идеей, так как данные только изменяются на, вставляют/обновляют - дополнение другого столбца занимает больше места в DB и будет немного медленнее для вставок и обновлений, но может быть очень быстрее для выборов - предпочтительный подход должен зависеть от Ваших приоритетов там, но, как указано, большинство таблиц читается далекий чаще, чем они записаны.
И этот вопрос И этот вопрос попытка ответить на это.
резюме - то, что Oracle имеет созданный в функции для этого с SQL-сервером, Вы застреваете или определение пользовательской функции или использование операторов выбора.