0

フォームに自動提案を表示するこの関数があります:

function searchbyId($params) {

    $input = strtolower($params['input']);
    $len = strlen($input);
    $limit = isset($params['limit']) ? (int) $params['limit']:25;
    $items=array();
    $sql='SELECT DISTINCT nIdentidad, CONCAT(primerNombre, ' ', segundoNombre, ' ', primerApellido, ' ', segundoApellido) AS nombre FROM tarjeta_indent WHERE nIdentidad LIKE \''.$input.'%\' ORDER BY nIdentidad LIMIT '.$limit;
    $resp=db_query($sql);
    if($resp && db_num_rows($resp)){
        while(list($nIdentidad)=db_fetch_row($resp)) {
            //$name=(strpos($name,'@')===false)?$name:'';
            $items[] ='{"id": "'.$nIdentidad.'", "value": "'.$nIdentidad.'"}';

        }
    }
    $result= '{"results": ['.implode(", ", $items).']}';
    return $result;
}

ただし、クエリを次のように変更した場合にのみ機能します。

$sql='SELECT DISTINCT nIdentidad FROM tarjeta_indent WHERE nIdentidad LIKE \''.$input.'%\' ORDER BY nIdentidad LIMIT '.$limit;

連結部分をどのように行うことができますか?

ありがとう。

4

2 に答える 2

1

これは明らかに単純だと思いますが、concat ステートメントに構文エラーがあります。文字列をエスケープするために一重引用符を使用していますが、PHP 文字列は一重引用符で定義されています。

$sql='SELECT DISTINCT nIdentidad, CONCAT(primerNombre, ' ', segundoNombre, ' ', primerApellido, ' ', segundoApellido) AS nombre FROM tarjeta_indent WHERE nIdentidad LIKE \''.$input.'%\' ORDER BY nIdentidad LIMIT '.$limit;

これはどう?

$sql = sprintf(<<<SQL
    SELECT
      DISTINCT nIdentidad,
      CONCAT(primerNombre, ' ', segundoNombre, ' ', primerApellido, ' ', segundoApellido) AS nombre
    FROM tarjeta_indent
    WHERE nIdentidad LIKE '%s'
    ORDER BY nIdentidaa
    LIMIT %d
SQL
  , mysql_real_escape_string($input), $limit);

私が正しくdb_query、Drupal を使用している場合は、代わりにこれを試してください (Drupal 7 の場合):

$sql = <<<SQL
    SELECT
      DISTINCT nIdentidad,
      CONCAT(primerNombre, ' ', segundoNombre, ' ', primerApellido, ' ', segundoApellido) AS nombre
    FROM tarjeta_indent
    WHERE nIdentidad LIKE :input
    ORDER BY nIdentidaa
    LIMIT :limit
SQL;
$resp = db_query($sql, array(':input' => $input, ':limit' => $limit));

これは Drupal 6 バージョンになります。

$sql = <<<SQL
    SELECT
      DISTINCT nIdentidad,
      CONCAT(primerNombre, ' ', segundoNombre, ' ', primerApellido, ' ', segundoApellido) AS nombre
    FROM tarjeta_indent
    WHERE nIdentidad LIKE %s
    ORDER BY nIdentidaa
    LIMIT %d
SQL;
$resp = db_query($sql, $input, $limit);
于 2012-11-16T15:16:47.863 に答える
0

CONCAT は文字列/varchar では機能しますが、数値では機能しません。したがって、primerNombre と segundNombre が INT データ型の場合、CONCAT は失敗します。CONVERT 関数を使用してみてください。

SELECT DISTINCT nIdentidad, 
       CONCAT( CONVERT(primerNombre, char(8)), ' ', 
               CONVERT(segundoNombre, char(8))  ) as nombre
于 2012-11-16T14:53:29.223 に答える