2009-10-18 7 views
0

Possible en double:
PHP warning help?Problème d'alerte PHP?

Je suis nouveau à php et mysql, je pense que j'égaré le mysqli_real_escape_string() Je continue de recevoir l'avertissement suivant sur la ligne 3.

Attention: mysqli_real_escape_string() attend exactement 2 paramètres, 1 donné en

Voici le code php.

<?php 

$page = mysqli_real_escape_string($_SERVER['SCRIPT_FILENAME']); 

// Query member data from the database and ready it for display 
$mysqli = new mysqli("localhost", "root", "", "sitename"); 
$dbc = mysqli_query($mysqli,"SELECT id page FROM mysql_counter_logs WHERE page = '$page'"); 

if (mysqli_num_rows($dbc) == 0) { 
     $mysqli = new mysqli("localhost", "root", "", "sitename"); 
     $dbc = mysqli_query($mysqli,"INSERT INTO mysql_counter_logs (page) VALUES ('$page')"); 
} 

if ($dbc == 1) { 
     $dbc = mysqli_query($mysqli,"UPDATE mysql_counter_logs SET hits = hits + 1 WHERE page = '$page'"); 
} 

//Retreives the current count 
$count = mysqli_fetch_row(mysqli_query($mysqli,"SELECT hits FROM mysql_counter_logs")); 

if (!$dbc) { 
     // There was an error...do something about it here... 
     print mysqli_error(); 
} 


//Displays the count on your site 
print "$count[0]"; 

?> 

Aussi est-il un moyen que je peux rendre ce code plus de sécurité des attaques XSS. Merci

Répondre

0

Vous créez déjà une instance, vous devez utiliser $mysqli->real_escape_string style OO, pas de style procédural.

+0

Où dois-je placer cela? – new

+0

En fait - je ne faisais pas attention. Vous devez alimenter le handle en tant que premier paramètre. –

2

Plusieurs éléments sont incorrects avec votre exemple de code.

Premièrement, mysqli_real_escape_string a besoin d'une connexion à établir avant de l'appeler. Deuxièmement, vous devez transmettre cette connexion à mysqli_real_escape_string. Troisièmement, vous mélangez la version d'objet de l'API mysqli avec la version procédurale. Vous devez en choisir un et s'y tenir.

Si vous allez utiliser la version d'objet, alors vous devez faire quelque chose comme ce qui suit:

$con = new mysqli(...); 
$clean_data = $con->real_escape_string($your_string); 
$con->query("SELECT ... FROM ... WHERE .. ='$clean_data'"); 

Et ainsi de suite.

Si vous allez emprunter la voie procédurale alors que vous devez faire:

$con = mysqli_connect(...); 
$clean_data = mysqli_real_escape_string($con, $your_string); 
$result = mysqli_query($con, "SELECT ... FROM ... WHERE ... = '$clean_data'); 

http://php.net/mysqli

+0

quelle est la différence entre l'objet et la procédure? – new

+0

Il n'est pas particulièrement facile de le résumer dans un commentaire, donc je vais vous lier à un tutoriel: http://devzone.zend.com/node/view/id/638 –