Как вызвать URL-адрес php с параметрами и использовать их в SQL-запросе на SQLite3 (строка цитирования)?

Я работаю в Windows 7, использую PHP версии 5.6.14 на Apache 2.4: мне нужно построить выборку запроса в базе данных SQLite3 с помощью PHP.

ПРИМЕЧАНИЕ: я новичок в PHP .....

Мой код следующий

<?php

$comune = $_GET["comune"];
echo $comune;
echo '<br>';
echo '<br>';

$db = new SQLite3('PrezziBenzina');

if ($db) {
    $q = $db->prepare('SELECT distr.Gestore, distr.Indirizzo, distr.Bandiera, prz.descCarburante, prz.prezzo FROM anagrafica_impianti_attivi as distr join prezzo_alle_8 as prz ON (prz.idImpianto = distr.IdImpianto) WHERE distr.Comune = ?');
    $q->bindvalue(1, $comune, SQLITE3_TEXT);
    $results = $q->execute();

    while ($row = $results->fetchArray(SQLITE3_ASSOC)) {
       print $row['Bandiera'];
       print ' -- ';
       print $row['descCarburante'];
       print ' -- ';
       print $row['prezzo'];
       print '<br>';
    }
} else {
    print "Connection to database failed!\n";
}
?>

Когда я вызываю свою процедуру, используя

http://localhost/ProvaAccessoDB-V02.php?comune=CARIGNANO

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

http://localhost/ProvaAccessoDB-V02.php?comune=LA LOGGIA
http://localhost/ProvaAccessoDB-V02.php?comune=L'AQUILA
http://localhost/ProvaAccessoDB-V02.php?comune=SANT'ALBANO STURA
http://localhost/ProvaAccessoDB-V02.php?comune=AGLIE'

мой запрос не работает.

Как я могу заключить в кавычки / убрать из кавычек мою переменную $comune, чтобы управлять всеми URL-адресами, которые не работают?

Любые предложения приветствуются. заранее большое спасибо

Чезаре


person Cesare    schedule 27.11.2015    source источник
comment
поскольку вы используете sqlite, попробуйте экранировать апостроф ' с помощью апострофа. что в основном означает '', устанавливаемая переменная должна быть сохранена с L''AQUILA, попробуйте $comune = str_replace(','',$_GET['comune']); и посмотреть, как   -  person Mark Ng    schedule 27.11.2015
comment
Только что попробовал, но все равно не работает... :-( В любом случае спасибо!   -  person Cesare    schedule 27.11.2015
comment
сделать прямой вызов URL с помощью localhost/ProvaAccessoDB-V02.php?comune=L'' AQUILA и посмотрите, работает ли это   -  person Mark Ng    schedule 27.11.2015
comment
Кстати, измените ваш $db->prepare('query') на (query), чтобы попробовать метод, это может помочь, так как апостроф может закрыть оператор, вызвавший ошибку.   -  person Mark Ng    schedule 27.11.2015
comment
Перепробовал все ваши предложения... к сожалению, хороших новостей нет....   -  person Cesare    schedule 27.11.2015
comment
@Mark Ng, ты знаешь, как я могу увидеть текстовую версию моего $ q после привязки и до ее выполнения?   -  person Cesare    schedule 27.11.2015
comment
Давайте продолжим обсуждение в чате.   -  person Mark Ng    schedule 27.11.2015


Ответы (2)


Пытаться..

<?php 
//conn parameter 
$db = new PDO('sqlite:PrezziBenzina'); 

//this will set to catch error 
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 

//get url param 
$comune = $_GET['comune']; 
echo $comune; 
echo '<br>'; 
echo '<br>'; 

//set query var - OP original, nothing wrong, just testing with mine.
//$q="SELECT distr.Gestore, distr.Indirizzo, distr.Bandiera, prz.descCarburante, prz.prezzo 
//FROM anagrafica_impianti_attivi as distr 
//JOIN prezzo_alle_8 as prz ON (prz.idImpianto = distr.IdImpianto) WHERE distr.Comune = :Comune";

//set query var
$q="SELECT anagrafica_impianti_attivi.Gestore, anagrafica_impianti_attivi.Indirizzo, anagrafica_impianti_attivi.Bandiera, prezzo_alle_8.descCarburante, prezzo_alle_8.prezzo 
    FROM anagrafica_impianti_attivi
    INNER JOIN prezzo_alle_8
    ON prezzo_alle_8.idImpianto = anagrafica_impianti_attivi.IdImpianto
    WHERE anagrafica_impianti_attivi.Comune = :Comune";

//as the name suggest, it try to query and if there is error, we cath the error, these are useful during staging.   
try { 
//prepare query
$stmt = $db->prepare($q);

//bind  
$stmt->execute(array(':Comune'=>$comune, )); 

//fetch and print
while ($row = $stmt->fetch(SQLITE3_ASSOC)){
    print $row['Bandiera']; 
    print ' -- '; 
    print $row['descCarburante']; 
    print ' -- '; 
    print $row['prezzo']; 
    print '<br>'; 
    } 
}

//catch error 
catch(PDOException $e) { 
    print "Something went wrong or Connection to database failed! ".$e->getMessage();
} 
?>

Веселиться. Кроме того, вы не можете передать yoururl.php?comune=LA LOGGIA, использовать LA%LOGGIA в html или вместо этого использовать метод POST.

person Mark Ng    schedule 27.11.2015

Экранируйте строку, используя escapeString().

$q->bindvalue(1, $db->escapeString($comune), SQLITE3_TEXT);
person Samir    schedule 27.11.2015
comment
Мммм.. Я пробовал, но безрезультатно. Есть ли способ распечатать/показать выполненный запрос? $q в моем коде - это не строка, поэтому я не вижу запроса... В любом случае спасибо! - person Cesare; 27.11.2015