При использовании MySQL-запроса в foreach сначала выберите «хорошо», но потом нет - PullRequest
0 голосов
/ 09 мая 2011

С этим кодом:

foreach ($content as $value) {
    $data=$value[0];
    echo $data; 
    $req="SELECT * FROM TABLE WHERE data='$data'";
    $result=mysql_query($req) or die ('Erreur :'.mysql_error());
    if (mysql_num_rows($result)){
        echo '  ENTRY EXISTS';
    }
    else {
        echo '  ENTRY DOES NOT EXIST';
    }   
}

Для первого $value он находит запись, которая является правильной. Для следующих это не так, но это должно быть. Как это можно исправить?


Обновление кода

С этим кодом:

        $found_list = array();

        $fetch_list = array();
        foreach($content as $value){
            $fetch_list[] = "'" . mysql_real_escape_string($value[0]) . "'";
        }

        if( empty($fetch_list) ){
            echo '<p>No data to fetch</p>';
        }else{

            $sql = 'SELECT DISTINCT inst_name
                FROM INSTITUTS
                WHERE inst_name IN (' . implode(', ', $fetch_list) . ')';
            $res = mysql_query($sql)
                or die ('Error: ' . mysql_error());
            while( $row = mysql_fetch_assoc($res) ){
                $found_list[] = $row['inst_name'];
            }
            var_dump($found_list);
        }

        foreach($content as $value){
            echo '<br/>';
            echo $value[0] . ' ';
            if( in_array($value[0], $found_list) ){
                echo "ENTRY EXISTS\n <br/>";
            }else{
                echo "ENTRY DOES NOT EXIST\n <br/>";
            }
        }

И результат:

 array(3) { [0]=> string(13) "AixEnProvence" [1]=> string(19) "AixEnProvenceAnnexe" [2]=> string(7) "Acheres" } 
acheres ENTRY DOES NOT EXIST 
AixEnProvence ENTRY EXISTS 
aixenprovenceannexe ENTRY DOES NOT EXIST 
instituttest ENTRY DOES NOT EXIST

1 Ответ

5 голосов
/ 09 мая 2011

Нет причин загружать сервер MySQL практически идентичными запросами.Взгляните на IN выражение :

SELECT foo, bar
FROM table
WHERE data IN ('a', 'b', 'c');

Я также предлагаю вам Google для инъекций SQL и XSS-атак.

Редактировать: Вот некоторый код, который решает проблему, как описано в последних комментариях:

<?php

// $content = ...
$found_list = array();

$fetch_list = array();
foreach($content as $value){
    $fetch_list[] = "'" . mysql_real_escape_string($value[0]) . "'";
}

if( empty($fetch_list) ){
    echo '<p>No data to fetch</p>';
}else{
    $sql = 'SELECT DISTINCT data
        FROM table
        WHERE data IN (' . implode(', ', $fetch_list) . ')';
    $res = mysql_query($sql)
        or die ('Error: ' . mysql_error());
    while( $row = mysql_fetch_assoc($res) ){
        $found_list[] = $row['data'];
    }
}

foreach($content as $value){
    echo $value[0] . ' ';
    if( in_array($value[0], $found_list) ){
        echo "ENTRY EXISTS\n";
    }else{
        echo "ENTRY DOES NOT EXIST\n";
    }
}

?>

Ответ на обновленный вопрос:

PHP операторы сравнения с учетом регистра:

<?php
var_dump('Acheres'=='acheres'); // bool(false)
?>

Вы можете использовать strtolower () для нормализации значений перед сравнением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...