2010-12-16 119 views
0

我试图定义一个用户注册类,这是功能我对现在这个查询有什么问题?

<?php 

///// SE SUPONE QUE AQUI EL USUARIO YA HA INTRODUCIDO SUS DATOS DE REGISTRO 


/* Conectando la Base de Datos */ 
include("includes/basedatos.php"); 

require_once("includes/funciones.php"); 

class registro_usuarios 
{ 

    var $pass; 
    var $email; 
    var $nombre; 

    public function tratandovariables() 
    { 

     /* Eliminando Caracteres Especiales */ 
     $password = htmlspecialchars($_POST['pass']); 
     $mail = htmlspecialchars(strip_tags($_POST['mail'])); 
     $nombre = htmlspecialchars(strip_tags($_POST['nombre'])); 

     if (preg_match("/^[a-zA-Z0-9\-_]{3,20}$/", $nombre)) 
     { 
      /* Asignando Valor */ 
      $this->pass = md5($password); 
      $this->email = $mail; 
      $this->nombre = $nombre; 
     } 
     else 
     { 
      echo "El nombre de usuario no es válido<br>"; 
      exit; 
     } 
    } 

    public function register() 
    { 
     $this->tratandovariables(); 




     /* Comprobando si existe el usuario */ 
     $check = "SELECT * FROM usuarios WHERE alias = '$this->nombre'"; 
     $qry = mysql_query($check); 

     /* La compracion */ 
      if (mysql_num_rows($qry)) 
      { 
       echo "Lo sentimos, el nombre de usuario ya esta registrado.<br />"; 
       mysql_free_result($qry); 
       return false; 
      } else 
      { 





       $insert = "INSERT INTO usuarios (alias, pass, email, fid, fechar, ultima, img_src, reputacion) VALUES ('".$this->nombre."','".$this->pass."','".$this->email."','-1', 'NOW()', 'NOW()',' ', '0')"; 
       $qry = mysql_query($insert); 
        if(mysql_affected_rows()) 
        { 
         echo "El Usuario $this->nombre se Registro Correctamente"; 
         return true; 
        } 
        else 
        { 
         echo "Error Ingresando datos"; 
         return false; 
        } 
       return false; 
      } 
    } 

} 
?> 

而问题是,我是通过永诺没有一个形式给出这个错误(进入一个简单的VARCHAR奇怪的字符):

警告:mysql_fetch_array():提供的参数不是在/home/piscolab/public_html/keepyourlinks.com/Recetas/registro.php一个有效的MySQL结果资源上线52 萨尔瓦多Usuario托尼瑟Registro Correctamente

  • $ this-> nombre有一个非空值(选中)
  • 数据库为空,所以应该没有结果。
  • 问题是脚本继续并假装用户已经注册,甚至显示名称!并没有更新数据库..

我只是不能看到问题..你能吗?

谢谢!

+0

你能从registro.php发布第52行吗?我在这里看不到mysql_fetch_array。实际上,在第51行,你执行查询。显示确切的查询。此外,您可以尝试在mysql_query()函数(如果使用它)后面添加“或die(mysql_error())”以查看查询是否有错误(例如表名错误)。 – Tjirp 2010-12-16 17:44:39

+0

哇,您应该意识到,您对[SQL Injection](http://en.wikipedia.org/wiki/SQL_injection)攻击广泛开放,对吧?要么逃避您的输入(通过'mysql_real_escape_string')或使用参数化查询(更好的选择)... – ircmaxell 2010-12-16 17:52:20

+0

MySQL只会说英语。 mattbasta 2010-12-16 20:00:38

回答

0

好,非常感谢你对我的帮助,

似乎有不同的错误(带属性附加伤害名,tipical ......),而是因为发现了这些错误剧照值得..

如果有人需要它,类代码:再次(适应你的atributes)

class registro_usuarios 
{ 

    var $pass; 
    var $email; 
    var $nombre; 

    public function tratandovariables() 
    { 

     /* Eliminando Caracteres Especiales */ 
     $password = htmlspecialchars($_POST['pass']); 
     $mail = htmlspecialchars(strip_tags($_POST['mail'])); 
     $nombre = htmlspecialchars(strip_tags($_POST['nombre'])); 

     if (preg_match("/^[a-zA-Z0-9\-_]{3,20}$/", $nombre)) 
     { 
      /* Asignando Valor */ 
      $this->pass = md5($password); 
      $this->email = $mail; 
      $this->nombre = $nombre; 
     } 
     else 
     { 
      echo "El nombre de usuario no es válido<br>"; 
      exit; 
     } 
    } 

    public function register() 
    { 
     $this->tratandovariables(); 




     /* Comprobando si existe el usuario */ 
     $check = "SELECT * FROM usuarios WHERE alias = '".$this->nombre."'"; 
     $qry = mysql_query($check); 

     /* La compracion */ 
      if (mysql_num_rows($qry)) 
      { 
       echo "Lo sentimos, el nombre de usuario ya esta registrado.<br />"; 
       mysql_free_result($qry); 
       return false; 
      } else 
      { 





       $insert = "INSERT INTO usuarios (alias, pass, mail, fid, fechar, ultima, img_src, reputacion) VALUES ('".$this->nombre."','".$this->pass."','".$this->email."','-1', NOW(), NOW(),' ', 0)"; 
       $qry = mysql_query($insert); 
        if(mysql_affected_rows()) 
        { 
         echo "El Usuario $this->nombre se Registro Correctamente"; 
         return true; 
        } 
        else 
        { 
         echo "Error Ingresando datos"; 
         return false; 
        } 
       return false; 
      } 
    } 

} 

谢谢!

0

使用串联这里:

/* Comprobando si existe el usuario */ 
    $check = "SELECT * FROM usuarios WHERE alias = '".$this->nombre."'"; 
+3

但实际上,**停止使用字符串操作**并使用占位符/参数化查询。 – 2010-12-16 17:45:14

+0

这不是问题。 – 2010-12-16 17:48:10

+0

的确,我只是指出了一个错误。 PDO应该是处理DB(面向对象)的更好选择。 http://php.net/manual/fr/book.pdo.php – 2010-12-16 17:56:40

1

从各地删除引号“NOW()”否则你将作为一个字符串,而不是MySQL的时间戳

-1

试试这个代替;

$check = "SELECT * FROM usuarios WHERE alias = '".$this->nombre."'"; 

而我在代码中没有看到任何mysql_fetch_array()语句。

+0

好吧,做了连接,'mysql_fetch_array()'我应该在哪里放置它? – 2010-12-16 17:50:59

+0

你的错误意味着你已经在某处使用它。正如Rocket在类似的回答中所说的那样,这个答案不是问题。 – 2010-12-16 17:52:58

+0

但实际上,**停止使用字符串操作**并使用占位符/参数化查询。 – 2010-12-16 17:57:07

0

PHP manual says

资源的mysql_query(字符串$查询 [,资源$ link_identifier]) 的mysql_query()发送一个唯一的查询 (多个查询不支持) 当前活动数据库 与 指定的link_identifier关联的服务器。

如果您没有“当前活动的数据库”,那么您的mysql_ *调用将失败。为您的呼叫提供MySQL连接链接标识符总是最佳做法。

你在哪里打电话给mysql_connect?