2015-04-03 11 views
0

Во время AsyncTask я прохожу среди других числовой строки w1:SQL странно сравнение числовых строк

params.add(new BasicNameValuePair("weight1", w1)); 

на следующий сценарий PHP:

<?php 

require("config.inc.php"); 
$query_params = null; 

    $query = " SELECT onoma01 , epitheto01 , email01 ,username1,startPoli1, finalPoli1, 
    eidosmetaf1, weight1 , depDate1 , depTime1, tilefono01 
FROM customer ,registration1 
where 
(:sp1='empty' or customer.startPoli1 = :sp1) and 
(:w1='empty' or customer.weight1 < :w1) and 
    ( :em1='empty' or customer.eidosmetaf1 = :em1) and 
    ( :fp1='empty' or customer.finalPoli1 = :fp1) and 
    ( :dD1='empty' or customer.depDate1 = :dD1) and 
(customer.username1 = registration1.username01)";  

    $query_params = array(

     ':sp1' => $_POST['startPoli1'], 
     ':w1' => $_POST['weight1'], 
     ':em1' => $_POST['eidosmetaf1'],  
     ':fp1' => $_POST['finalPoli1'], 
     ':dD1' => $_POST['depDate1']    
    ); 

    try { 
     $stmt = $db->prepare($query); 
     $result = $stmt->execute($query_params); 
    } 
    catch (PDOException $ex) { 

     $response["success"] = 0; 
     $response["message"] = "Database Error2. Please Try Again!"; 
     die(json_encode($response)); 
    } 

    $results = array(); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 

    $results[] = array(

    'onoma' => $row['onoma01'], 
     'epitheto' => $row['epitheto01'], 
     'email' => $row['email01'], 
     'username1' => $row['username1'] , 
     'startPoli1' => $row['startPoli1'], 
     'finalPoli1' => $row['finalPoli1'], 
     'eidosmetaf1' => $row['eidosmetaf1'], 
     'weight1' => $row['weight1'] , 
     'depDate1' => $row['depDate1'], 
     'depTime1' => $row['depTime1'], 
     'tilefono1' => $row['tilefono01'] 

    ); 
    } 

    echo json_encode(array('select_itin_results' =>$results)); 

?> 

я спрашиваю из базы данных для возврата строки, которая включает вес меньше w1. Мой дб включает в себя весовые коэффициенты:

(100 , 200 , 350 ,2000) 

Когда я установить w1 = 400, он возвращает все выше цифры, включая 2000. Кажется, что он сравнивает номер два номера по номеру (4 400 больше, чем 2 от 2000 года). Как получилось; (Обратите внимание, что столбец веса в базе данных имеет тип varchar.T попытался изменить на int без эффекта. Также я попытался отличить $ _POST ['weight1'] как int, но ничего. Спасибо

+1

Вы делаете сравнения в SQL, а не PHP, так что это не проблема сравнения PHP. И, конечно, если вы используете varchars для хранения чисел, база данных также может выполнять сравнения как строки. Вы можете присвоить значения цифрам, а затем выполнить сравнение. –

+1

Какие РСУБД это? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

ответ

0

Процитировать documentation of execute:

массив значений с таким количеством элементов, так как привязанных параметры в операторе SQL, выполняемом. Все значения обрабатываются как PDO::PARAM_STR.

Это заставляет MySQL использовать лексикографическое сравнение, и , как вы отметили, 400-й год 4 приходит до 2000-х 2. Вы можете контролировать тип значения ограничены, как с помощью bindValue:

# Prepare the query 
$stmt = $db->prepare($query); 

# Bind values 
$stmt->bindValue(':sp1', $_POST['startPoli1'], PDO::PARAM_STR); 
$stmt->bindValue(':w1', $_POST['weight1'], PDO::PARAM_INT); # Bind as int! 
$stmt->bindValue(':em1', $_POST['eidosmetaf1'], PDO::PARAM_STR); 
$stmt->bindValue(':fp1', $_POST['finalPoli1'], PDO::PARAM_STR); 
$stmt->bindValue(':dD1', $_POST['depDate1'], PDO::PARAM_STR); 

# Execute with the bound parameters 
$result = $stmt->execute(); 
Смежные вопросы