выбрать несколько идентификаторов в сложном запросе mysql [duplicate]

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);
0
задан user96828 9 July 2009 в 04:11
поделиться

4 ответа

Второй запрос должен использовать $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. : -)

5
ответ дан John Kugelman 27 August 2018 в 14:45
поделиться
  • 1
    Потрясающие! Большое вам спасибо. Да, мне нужно будет исправить код против инъекций, спасибо за напоминание. – user96828 9 July 2009 в 04:30
  • 2
    Постскриптум Вы также можете сделать это в одном запросе с подвыборкой: 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

Я ожидаю, что вам будет лучше сделать это в одном запросе с соединением:

$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);
0
ответ дан acrosman 27 August 2018 в 14:45
поделиться

Попробуйте это:

$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 */

}
0
ответ дан Chris Bier 27 August 2018 в 14:45
поделиться

Пара вещей. Сначала у вас есть ненужный цикл. Попробуйте:

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);
0
ответ дан Matt Bridges 27 August 2018 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: