Visualizzazione risultati 1 fino 9 di 9

Discussione: Errore recupero dati da google api e inserimento in tabella mysql

  1. #1
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito Errore recupero dati da google api e inserimento in tabella mysql

    Sul mio sito, nella sezione video, ho inserito tutti i video presenti sul mio canale, lo script non legge direttamente dalla api di google, per evitare che mi scadono le query al secondo, ma da due tabelle popolate, con i miei video di youtube, tramite questo script:

    Codice PHP:
    <?php
    if (isset($_GET["synch"])) {
    $connection->query("DELETE FROM youtube_playlists");
    $connection->query("DELETE FROM youtube_videos");

    // enumerate playlist on youtube channel
    $playlists = file_get_contents("https://www.googleapis.com/youtube/v3/playlists?part=snippet&maxResults=10&channelId=" . YT_CHANNEL . "&key=" . YT_KEY);
    $playlists = json_decode($playlists);

    $notView = array("Tutte le mie App");

    foreach(
    $playlists->items as $items) {
    if (
    in_array($items->snippet->title, $notView)) break;

    $it_title = $connection->real_escape_string($items->snippet->title);
    $en_title = $connection->real_escape_string($items->snippet->localized->title);
    $thumbnail = $connection->real_escape_string($items->snippet->thumbnails->medium->url);
    $it_description = $connection->real_escape_string($items->snippet->description);
    $en_description = $connection->real_escape_string($items->snippet->localized->description);

    $query = "INSERT INTO youtube_playlists VALUES ('$it_title', '$en_title', '$thumbnail', '$it_description', '$en_description')";
    $connection->query($query);

    $videos_playlist = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=25&playlistId=" . $items->id .
    "&key=" . YT_KEY;
    $videos_playlist = json_decode(file_get_contents($videos_playlist));

    foreach (
    $videos_playlist->items as $vitems) {
    $v_id = $connection->real_escape_string($vitems->snippet->resourceId->videoId);
    $v_it_title = $connection->real_escape_string($vitems->snippet->title);
    $v_thumbnail = $connection->real_escape_string($vitems->snippet->thumbnails->medium->url);
    $v_it_description = $connection->real_escape_string($vitems->snippet->description);

    $v_query = "INSERT INTO youtube_videos VALUES ('$en_title', '$v_id', '$v_it_title', '', '$v_thumbnail',
    '
    $v_it_description', '')";

    if (!
    $connection->query($v_query)) echo $connection->error;
    }
    }
    }
    ?>
    <a href="index.php?page=videos&synch">Synchronize playlists / videos with youtube channel</a>
    <p />
    <?php
    $pl_select
    = $connection->query("SELECT en_title FROM youtube_playlists");

    while (
    $pl_row = $pl_select->fetch_array(MYSQLI_ASSOC)) {
    ?>
    <div style="margin:10px">
    <font onclick="" style="cursor:pointer"><span>+</span>&nbsp;&nbsp;<?=$pl_row["en_title"] ?></font>
    <?php
    $v_select
    = $connection->query("SELECT playlist, it_title FROM youtube_videos WHERE playlist = '" . $pl_row["en_title"] . "'");

    while (
    $v_row = $v_select->fetch_array(MYSQLI_ASSOC)) {
    ?>
    <div style="margin:10px; margin-left:30px"><?=$v_row["it_title"] ?></div>
    <?php
    }
    ?>
    </div>
    <?
    }
    ?>
    Questo script, mi memorizza nel database tutte le playlist e video, per le playlist me le memorizza correttamente, per i video invece no, la query eseguo la query in $v_query mi da il seguente errore:

    Codice:
    Incorrect string value: '\xE2\x96\xBA So...' for column 'it_description' at row 1
    Come mai? Premetto che lo script qualche giorno fa mi andava senza restituirmi nessun problema.

    Sevenjeak
    Software developer and much more

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,064

    Predefinito

    Se stampi (echo) la variabile $v_query cosa mostra? O meglio, qual è la variabile associata al campo "it_description" e cosa vale? Ha caratteri strani?

    Ciao!

  3. #3
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Se stampo la variabile v_query mi stampa, per ogni ciclo, la query correttamente.

    Si la variabile associata al campo it_description ha caratteri speciali.

    La cosa strana, e che ho scritto anche nel post, é che, il codici prima mi funzionava.

    L'unica cosa é che nel frattempo, provando a memorizzare la data del video o aggiunto un campo di tipo datatime alla tabella e poi modificato il codice in modo che estraeva la data dal video, ma, visto che la tabella me la popolava senza il campo data, ho riportato il codice come era prima ( come l'ho scritto nel primo messaggio ) ed ho eliminato dalla tabella il campo data, non penso che e stato quello a verificare l'errore, o sbaglio?

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Codice PHP:
    //Incorrect string value: '\xE2\x96\xBA
    se l'input originale è diverso dal tuo output "►" (BLACK RIGHT-POINTING POINTER) è convertito in sequenza di codice esadecimale "\xhex" e in php una variabile si espande con gli apici doppi per rappresentare la "sequenza di carattere".

    Codice PHP:
    $mysqli = new mysqli('localhost', 'user', '', 'my_user'); //sostituire user con il proprio user e anche my_user con il prefisso my_ e il proprio user
    $mysqli->set_charset('utf8');
    $connection->query('SET NAMES utf8 COLLATE utf8_unicode_ci');
    $v_it_description = '\\xE2\\x96\\xBA'; // corretta backslash per apici singoli
    $copy = $v_it_description; //copia per valore
    $espansione_variabile = "\xE2\x96\xBA"; //sintassi corretta per convertire esplicitamente in sequenza carattere da sequenza esadecimale con prefisso \x o \X
    var_dump($copy, $espansione_variabile);
    Questa sintassi forza UTF-8 per la connessione e anche la collocazione, ovviamente le tabelle e i campi dovrebbero supportare anch'esso UTF-8.

    Se la connessione è almeno nel sottoinsieme dei caratteri US-ASCII non dovrebbe esserci problemi anche se storicamente (tutt'ora su altervista) set_charset (quando filtrato da real_escape_string) non funziona per questo ti propongo SET NAMES (cioè da start ISO-8859-1 e a fine UTF-8 entrambi utilizzano almeno il sottoinsieme US-ASCII)

    PS. json_encode significa UTF-8. (Anche se utilizzi json_decode nel tuo codice).
    Ultima modifica di darbula : 14-05-2022 alle ore 01.02.10

  5. #5
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Ho provato a mettere questo prima dell'esecuzione del foreach:ù
    Codice PHP:
    $connection->set_charset('utf8');
    $connection->query('SET NAMES utf8 COLLATE utf8_unicode_ci');
    Ma non funziona lo stesso.

    Citazione Originalmente inviato da darbula Visualizza messaggio
    se l'input originale è diverso dal tuo output "►" (BLACK RIGHT-POINTING POINTER) è convertito in sequenza di codice esadecimale "\xhex" e in php una variabile si espande con gli apici doppi per rappresentare la "sequenza di carattere".
    Non ho ben capito cosa intendi, in'oltre, ripeto, come ho già detto nel mio primo post, che prima il codice mi funzionava benissimo, anche con il carattere "►", come mai?

    Sevenjeak
    Software developer and much more

  6. #6
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Poiché il driver mysql non vede caratteri supportati te li mostra preceduto da \x e esadecimale
    Spero così è chiaro
    Codice PHP:
    $v_it_description = '►'; //Input
    $v_query = "INSERT INTO youtube_videos VALUES ('$en_title', '$v_id', '$v_it_title', '', '$v_thumbnail',
    '
    $v_it_description', '')"; //Output modificato automaticamente in esadecimale '\xE2\x96\xBA'
    Scusa Dentro phpMyAdmin dopo aver selezionato il database my_sevenjeak puoi effettuare questa query
    Codice:
    SHOW CREATE TABLE IF NOT EXISTS `youtube_videos` \G
    per verificare se è UTF-8?
    Il perché è difficile da dire poiché questa configurazione di mysql è personalizzata da altervista, al più l'errore è quello da me indicato
    Ultima modifica di darbula : 16-05-2022 alle ore 14.57.09

  7. #7
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    La query non mi viene eseguita, mi dice che c'è un'errore nella sintassi sql,

    Nel frattempo ho provato sostituendo il carattere ► con la funzione str_replace() ed a quanto pare il problema non e solo quel carattere, visto che le query che mi popolano la tabella youtube_videos, mi si eseguono, ma solo le primi 21 ( considerando che mi le deve eseguire 44, una per ogni video che ho sul canale youtube )

    EDIT:

    Ho risolto, mi è bastato sostituire il set di caratteri del campo in utf8_bin
    Ultima modifica di sevenjeak : 16-05-2022 alle ore 15.00.10

    Sevenjeak
    Software developer and much more

  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ho editato il mio messaggio precedente (adesso la sintassi è corretta), puoi mostrare l'errore? Senza vedere è difficile

  9. #9
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    L'errore e questo:
    Codice:
    #1064 - 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 'IF NOT EXISTS `youtube_videos` \G' at line 1
    In ogni caso ho editato il mio precedente messaggio dicendo di aver risolto il problema semplicemente cambiando il set di caratteri del campo, grazie lo stesso per il vostro aiuto.
    Ultima modifica di sevenjeak : 16-05-2022 alle ore 15.32.23

    Sevenjeak
    Software developer and much more

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •