2012-04-20 2 views
1

J'ai ce SQL:mysql_query pas d'insérer une ligne correctement

INSERT INTO v3_peers 
        (torrent, peer_id, ip, ipv6, port, smoke_ip, uploaded, downloaded, up_ofset, down_ofset, remaining, started, last_action, connectable, userid, agent) 
        VALUES 
        ('13471', '-UT2200-ĂZŤjśŻl‰şđ^', '69.64.147.243', '2001:0:5ef5:79fd:14e6:7214:2a5f:5811', '58262', '', '0', '0', '0', '0', '0', '1334945327', '1334945327', 'yes', '1', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19') 

Lorsqu'il est exécuté dans le script, il est enregistré db, mais peer_id est seulement « -UT2200- » et le navigateur me donne boîte de dialogue pour enregistrer le fichier avec nom de sript et le contenu qui devrait être retourné comme sortie php en plain/texte

Lorsque j'insère ceci dans db par phpmyadmin tout va bien.

peer_id ont varchar type de données (255)

Toutes les idées ce qui est faux?

+1

quel encodage est votre fichier PHP? – Dion

+0

échappez-vous correctement vos valeurs avant d'essayer de les valider dans la base de données? –

+0

Le fichier PHP est en utf-8. J'essayais de m'échapper avec mysql_real_escape_string - pas de changement – Koga

Répondre

-1

Ok, j'ai trouvé l'erreur. Quand je compare données insérées dans les données db et réelles de $ peer_id = $ _ GET [peer_id] variable dans SQL comme:

WHERE peer_id LIKE '".$peer_id."' 

puis je me suis erreur car peer_id dans db est pas comme peer_id, mais quand j'utilise

WHERE peer_id = '".$peer_id."' 

cela fonctionne parfaitement. L'encodage de la colonne peer_id doit être mis à utf8-unicode-ci NOT utf8-general-ci !! Donc, il n'y avait pas d'erreur dans l'encodage (les caractères manquants dans phpmyadmin comme je l'ai écrit en question ne sont pas vraiment manquants mais cachés à cause du codage) mais l'erreur est dans d'autres scripts.

Merci à tous pour votre temps. J'espère que cela aidera quelqu'un à l'avenir.

0

Je beleave que MySQL ne permet pas les caractères spéciaux

+0

Partiellement vrai. Le problème est l'encodage des caractères. Si utilisé correctement, MySQL le permettrait. –

+1

Bien sûr, MySQL fonctionne avec ces personnages. – Dion

+0

J'ai trouvé un personnage qui n'a pas été copié à mon premier message. Il est entre les caractères "ş" et "đ", dans le fichier journal enregistré il est montré comme carré. Mais en format hexadécimal, il s'agit d'un point avec une représentation hexadécimale "01". Peut-on par cette erreur? – Koga

0

Peut-être essayer avec utf8_decode()

+0

Ne fonctionne pas, il enregistre tous les caractères dontome d'entre eux sont changés en "?". Unussable. – Koga

+0

et utf8_encode()? – Dion

+0

Même résultat, mais d'autres caractères sont modifiés. – Koga

1

Vous devez passer les variables dans la requête d'une manière sûre. Retravailler votre script et votre requête pour que les variables soient passées. E.g:

$peer_id = mysql_real_escape_string('-UT2200-ĂZŤjśŻl‰şđ^'); 
$query = 'INSERT INTO `v3_peers` (`peer_id`) VALUES ("' . $peer_id . '")'; 
$result = mysql_query($query); 

De cette façon, vous vous assurez que la variable n'affecte pas la structure de la requête.

En outre, et comme @ tereško mentionné, essayez PDO. Votre requête semble être fréquemment utilisée, de sorte que PDO et ses instructions préparées peuvent s'avérer utiles. J'ai expliqué cela récemment à quelqu'un: PDO prepared statements to store html content.

+0

Je l'ai essayé - aucun résultat. – Koga

+0

J'ai fait une erreur dans la requête - j'ai oublié de citer la chaîne. – bostaf

+0

@Koga Je viens de l'essayer avec mon script 'utf-8' décodé et le tableau' utf8 - utf8_unicode_ci' collation. Travaillé parfaitement. Vous avez mentionné que votre script est 'utf-8' - est-ce que cela s'applique à l'encodage de script bot et aux en-têtes de page? – bostaf