Activity
не полностью инициализирован и готов к просмотру представлений до тех пор, пока onCreate()
не будет вызван в onCreate()
.
Объявляйте только следующие поля:
private EditText usernameField, passwordField;
private TextView error;
private ProgressBar progress;
] , а затем назначьте значения в onCreate
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
usernameField = (EditText)findViewById(R.id.username);
passwordField = (EditText)findViewById(R.id.password);
error = (TextView)findViewById(R.id.error);
progress = (ProgressBar)findViewById(R.id.progress);
}
Не может быть частью проблемы, но в качестве дополнительной рекомендации, Timer
запускает TimerTask
на фоне нить, и этого следует избегать в этом случае. Вместо этого замените Timer
на Handler
, чтобы запустить его в потоке пользовательского интерфейса.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
}, 1500);
Второй запрос должен использовать $thelist
не $row
, и он должен быть вне цикла while
. Цикл foreach
не нужен при обработке одной строки. Вы можете получить доступ к имени в $row
с помощью простого $row[0]
. Что-то вроде этого (untested):
$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);
while($row = mysql_fetch_array($clientresult)){
$temp[] = '"'.$row[0].'"';
}
$thelist = implode(",",$temp);
$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY (date) desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
Внимание! Помните, что ваш код очень уязвим для SQL-инъекций . Это нормально для тестирования или внутреннего развития, но если этот код будет работать на веб-сайте Fort Knox, вы захотите его исправить совсем немного. Просто FYI. : -)
Я ожидаю, что вам будет лучше сделать это в одном запросе с соединением:
$query = "SELECT COUNT(*) FROM `studies` INNER JOIN `clients` on studies.client = clients.name WHERE clients.sector = '$sectorlink' ORDER BY studies.date DESC";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);
while($row = mysql_fetch_array($clientresult)){
$client = $row['name'];
$query = "SELECT * FROM studies WHERE client='$client' ORDER BY date DESC";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
/* echo results here */
}
Пара вещей. Сначала у вас есть ненужный цикл. Попробуйте:
while (list($name) = mysql_fetch_row($clientresult)) {
$temp[] = $name;
}
Чтобы создать свой временный массив.
Во-вторых, части предложения IN
являются строками, поэтому, когда вы взорваетесь, вам нужно заключить каждый значение в кавычках:
$thelist = "'". implode("','", $temp) . "'";
Наконец, в вашем запросе вы передаете $row
в предложение IN
, вы должны передавать $thelist
:
$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY date desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
Так что вообще:
$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);
while (list($name) = mysql_fetch_row($clientresult)) {
$temp[] = $name;
}
$thelist = "'". implode("','", $temp) . "'";
$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY date desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
SELECT count(*) FROM studies WHERE client IN (SELECT name FROM clients WHERE sector = '$sectorlink') ORDER BY (date) desc
. – John Kugelman 9 July 2009 в 04:35