1

我在这里遇到问题,我有这个查询:

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'for $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');
}
}
4

2 回答 2

1

首先,基本调试。改变这个:

$debug = false;

...进入这个:

$debug = true;

您将看到您的 SQL 包含的内容。

我有根据的猜测,如果您没有启用完整的错误报告并且您忘记了初始化$link,那么您(没有)看到此警告:

警告:mysqli_real_escape_string() 期望参数 1 为 mysqli,给定 null

...在这一行:

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

mysqli_real_escape_string()失败时,它会返回NULL,然后显示您的 SQL 查询,您会得到以下信息:

WHERE mha.Alumno_carnet = ''
                          ^^

旁注:

  1. 您正在使用支持准备好的语句的现代库。为什么要在意逃避?

  2. 你认为具体是做urldecode()什么的?url前缀是什么意思?

于 2013-04-04T11:24:48.530 回答
-1

我认为将变量添加到 sql ingetPrelaciones而不是将其发送到函数会更简单

像这样:

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);
}
于 2013-04-04T10:29:38.800 回答