2016-09-06 2 views
-3

Вы видите, что не так в этом вопросе? Я смотрел его очень долго, и я не вижу его.SQL - синтаксическая ошибка

ERROR: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

$sql="SELECT country_name FROM countries WHERE country_id IN ("; 
    foreach($cartContentVsDatabase as $key => $val){ 
     $sql.= $key['country_id'].",";   
    } 
    ")"; 
+3

Пожалуйста, покажите, что получилось в результате запроса после его установки. – Siyual

+2

узнать о подготовленных операциях – Jens

+0

'echo $ sql;' после вашего цикла, u получит ошибку – devpro

ответ

1

попробовать это, изменение ")"; к $sql.= ")";

$array_count = count($cartContentVsDatabase); 
    $temp_count = 0; 
    $sql="SELECT country_name FROM countries WHERE country_id IN ("; 
    foreach($cartContentVsDatabase as $key => $val){ 
     $temp_count++; 
     if($array_count < $temp_count) 
     { 
      $sql.= $val['country_id']; 
     } 
     else 
     { 
      $sql.= $val['country_id'].","; 
     } 

    } 
    $sql.= ")"; 
+0

Это решает 1 из ± 6 проблем, которые OP имеет в своем коде. Это само по себе не исправит. – trincot

+0

В конце еще есть '' ' –

+0

И' $ key' не может быть массивом. –

0

Вы могли бы сделать вашу жизнь намного легче

$sql= "SELECT country_name FROM countries WHERE country_id IN (".implode(",",array_column($cartContentVsDatabase,"country_id")). ")"; 

Вы можете (и, вероятно, должны) использовать подготовленный запрос, например как показано ниже:

$sql= "SELECT country_name FROM countries WHERE country_id IN (".implode(",",array_fill(0,count($cartContentVsDatabase),"?")). ")"; 

, а затем связать содержимое $cartContentVsDatabase при выполнении.

0

В вашем коде вы не соедините ")"; правильно в конце. Вы также можете хранить данные в массив и чем использовать implode() для разделенных запятой значений, как:

Пример:

<?php 

$sql = "SELECT country_name FROM countries "; 

$countries = array(); 
foreach($cartContentVsDatabase as $key => $val){ 
    $countries[] = $val['country_id']; // store country id in your array 
} 

if(count($countries) > 0){ 
    $countrylist = implode("','",$countries); // implode all country list with comma.  
    $sql .= "WHERE country_id IN ('$countrylist')"; 
}  
echo $sql; // print your query. 

?> 

Тем не менее я не знаю, $key['country_id'] является правильным или нет, я думаю, что это должен быть $val['country_id'].

2

Некоторые вопросы:

  • Вы завершающую запятую в списке стран,
  • страны должны быть указаны в виде строк,
  • вы обращаетесь значения из ключа вместо значения части элементы массива.
  • У вас есть оборванная закрывающая скобка, которая ничего не делает.
  • Вы даже не должны вводить строки страны, так как это делает ваш код уязвимым для инъекции кода: используйте подготовленные операторы.

Вот код, который вы можете использовать:

// first put the countries in an array 
foreach($cartContentVsDatabase as $key => $val){ 
    $countries[] = $val['country_id']; 
} 
// create a list of `?`: one for every country 
$in = join(',', array_fill(0, count($countries), '?')); 

// use that in the query 
$sql="SELECT country_name FROM countries WHERE country_id IN ($in)"; 

// Prepare the statement (this is PDO syntax) 
$statement = $pdo->prepare($select); 

// Pass the countries as parameter values, and execute 
$statement->execute($countries); 

См this Q&A больше на подготовленных заявлений в контексте данной статьи in (...).

+0

Мое голосование за подготовленное заявление – devpro