2013-04-04 2 views
1

я имею аа проблемы здесь, у меня есть этот запрос:MySQL ошибочный запрос

function getPrelaciones($carnet){ 
    $result = query(
     "SELECT mhm.Materia_codigo1 
     FROM Materia_has_Materia mhm 
     , Materia m 
     , (SELECT mha.Materia_codigo as materianovista 
      FROM Materia_has_Alumno mha 
      WHERE mha.Alumno_carnet = '11111') as n 
     WHERE n.materianovista = mhm.Materia_codigo 
     AND mhm.Materia_codigo1 != '' 
     AND n.materianovista = m.codigo"); 

    print json_encode($result); 
} 

и он работает, но когда я пытаюсь сделать это вообще, переключение '11111' для $carnet как следующий запрос, оно не работа, хорошо это работает, но он возвращает пустую JSON:

function getPrelaciones($carnet){ 
    $result = query(
     "SELECT mhm.Materia_codigo1 
     FROM Materia_has_Materia mhm 
     , Materia m 
     , (SELECT mha.Materia_codigo as materianovista 
     FROM Materia_has_Alumno mha 
     WHERE mha.Alumno_carnet = '%s') as n 
     WHERE n.materianovista = mhm.Materia_codigo 
     AND mhm.Materia_codigo1 != '' 
     AND n.materianovista = m.codigo", $carnet); 
    print json_encode($result); 
} 

любое решение ?, благодаря

моя функция запроса выглядеть следующим образом:

function query() { 
global $link; 
$debug = false; 

//get the sql query 
$args = func_get_args(); 
$sql = array_shift($args); 

//secure the input 
for ($i=0;$i<count($args);$i++) { 
    $args[$i] = urldecode($args[$i]); 
    $args[$i] = mysqli_real_escape_string($link, $args[$i]); 
} 

//build the final query 
$sql = vsprintf($sql, $args); 

if ($debug) print $sql; 

//execute and fetch the results 
$result = mysqli_query($link, $sql); 
if (mysqli_errno($link)==0 && $result) { 

    $rows = array(); 

    if ($result!==true) 
    while ($d = mysqli_fetch_assoc($result)) { 
     array_push($rows,$d); 
    } 

    //return json 
    return array('result'=>$rows); 

} else { 

    //error 
    return array('error'=>'Database error'); 
} 
} 
+1

Как выглядит ваша функция 'query'? – DCoder

+1

Измените 'mha.Alumno_carnet = '% s'' на' mha.Alumno_carnet like'% s'' – Meherzad

+2

@Meherzad Я думаю, что '% s' является строковым идентификатором, как в' printf', и в этом случае ему следует назначить значение для него. – Voitcus

ответ

-1

Я думаю, что это будет проще просто добавить переменную в SQL в getPrelaciones, а не отправить его в функцию

так:

function getPrelaciones($carnet){ 
    $result = query("SELECT mhm.Materia_codigo1 FROM Materia_has_Materia mhm, Materia m, (SELECT mha.Materia_codigo as materianovista FROM Materia_has_Alumno mha WHERE mha.Alumno_carnet = '".$carnet."')as n WHERE n.materianovista = mhm.Materia_codigo AND mhm.Materia_codigo1 != '' AND n.materianovista = m.codigo"); 
    print json_encode($result); 
} 
+0

Да, потому что SQL Injection - это просто миф. –

1

Прежде всего, основной отладки , Изменить это:

$debug = false; 

... в этом:

$debug = true; 

Вы увидите, что ваш SQL содержит.

Моя догадка если вы не включен полный отчет об ошибках, и вы забыли инициализирует $link, так что вы в (не) видя это предупреждение:

Предупреждение: mysqli_real_escape_string() ожидает параметр 1 будет MySQLi, нуль дал

... на этой линии:

$args[$i] = mysqli_real_escape_string($link, $args[$i]); 

Когда mysqli_real_escape_string() не удается, то возвращается NULL, таким образом, затем показывая свой SQL запрос вы получите следующее:

WHERE mha.Alumno_carnet = '' 
          ^^ 

Боковые ноты:

  1. вы используете современную библиотеку, которая поддерживает подготовленные заявления. Зачем ухаживать за побегом?

  2. Что именно вы думаете urldecode()? Что предлагает префикс url?

Смежные вопросы