mysql错误:不是有效的mysql资源

时间:2015-09-02 16:00:51

标签: php mysql

当我尝试检查电子邮件是否已注册时,我遇到了问题。有人可以帮忙吗?我有这个错误:

  

mysql_fetch_array():提供的参数不是行中的有效MySQL结果资源...

($record =mysql_fetch_array($result); )

<?php
    $nome = $_REQUEST["nome"];
    $cognome = $_REQUEST["cognome"];
    $psw = $_REQUEST["psw"];
    $email = $_REQUEST["email"];
    $nikName = $_REQUEST["nikName"];

    $conn = mysql_connect("host,name","userName","Password","databaseName");

    if(!$conn) {
        echo "connessione non satabilita";
    } else {
        if(!mysql_select_db("databaseName",$conn)) {
            echo "database non trovato";
        } else {
            $sql = "select * from utenti where User='$email'"; //costruzione comando di ricerca
            $result = mysql_query($sql,$conn); //assegnazione risultati
            $record =mysql_fetch_array($result); //estrazione primo risultato
            if(!$record) {
                $sql = "INSERT INTO User (UserId, Nome, Cognome, Email, Username, Password, TimeStamp) VALUES (NULL,'$nome','$cognome','$email','$nikName','$psw', NULL)";
                $result=mysql_query($sql);
                if($result) {
                    echo "utente registrato correttamente";
                } else {
                    //Error
                    echo "errore registrazione, riprovare più tardi";
                }
                echo "<br />";
                echo "utente registrato";
            } else {
                echo "utente gia registrato";
            }
        }
    }
?>

3 个答案:

答案 0 :(得分:2)

在此之前失控。

$conn = mysql_connect("host,name","userName","Password","databaseName");

您使用的是4个参数而不是3个。

旁注:4个参数是mysqli_语法http://php.net/manual/en/function.mysqli-connect.php
但要小心,那些不同的MySQL API 不是混合。因此,如果您决定将其更改为mysql_,则不能mysqli_

手册http://php.net/manual/en/function.mysql-connect.php声明:

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

第四个是其他的东西。

  

如果使用相同的参数对mysql_connect()进行第二次调用,则不会建立新链接,而是返回已打开链接的链接标识符。 new_link参数修改了这种行为,并使mysql_connect()始终打开一个新的链接,即使之前使用相同的参数调用了mysql_connect()。在SQL安全模式下,将忽略此参数。

  • 所以,只需删除第4个参数。

旁注:这是有问题的"host,name"(用逗号)。仔细检查您的主机(如果托管)为您提供了什么。大多数情况下,应该读作"localhost"

如上所述,您对SQL注入持开放态度。

使用预先准备好的声明:

至于你的其余代码:

error reporting添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:只应在暂存时进行显示错误,而不是生产。

同时将or die(mysql_error())添加到mysql_query()

关于您想要查看是否存在电子邮件;你可能最好使用mysql_num_rows()

即:

$sql = "select * from utenti where User='$email'";

$result = mysql_query($sql,$conn) or die(mysql_error($conn));

    if(mysql_num_rows($result) > 0)
    {...}

        else {...}

我注意到您可能以纯文本格式存储密码。如果是这种情况,则非常气馁。

我建议您使用CRYPT_BLOWFISH或PHP 5.5&#39 {s} password_hash()功能。对于PHP&lt; 5.5使用password_hash() compatibility pack

此外,这对您没有帮助:

if(!mysql_select_db("databaseName",$conn)){
                            echo "database non trovato";
                        }

这样做:

if(!mysql_select_db("databaseName",$conn)){
    die ('Can\'t use the database : ' . mysql_error());
}

为了得到真正的错误,应该有一个。

参考:

答案 1 :(得分:0)

如上所述, mysql_connect(); 存在语法错误,您尝试使用无效数量的参数。最好的方法是制作一个config.php文件,然后在需要时使用它。这是PDO中的基本connection code

<?php
$host = "localhost";
$database = "yourdbnamehere"; 
$username = "yourusernamehere";
$password = "yourpasswordhere";

try {
$dbo = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>

答案 2 :(得分:0)

您需要这样的解决方案。但是你必须切换到PDO或MySQLi以确保你的代码长期保持有效,并且你将能够编写安全稳定的代码。

首先完成这些:

http://php.net/manual/en/book.pdo.php

http://php.net/manual/en/book.mysqli.php

解决当前问题的示例代码:

<?php
    $nome = $_REQUEST["nome"];
    $cognome = $_REQUEST["cognome"];
    $psw = $_REQUEST["psw"];
    $email = $_REQUEST["email"];
    $nikName = $_REQUEST["nikName"];
    try{
        $pdo = new PDO('mysql:dbhost=hostname; dbname=databaseName', 'userName', 'Password');
    } catch (PDOException $e) {
        echo "Error connecting to database with error ".$e;
        die();
    }

    // check for email

    $sql = $pdo->prepare("select * from utenti where User= ?");
    $sql->bindParam('1', $email);
    $sql->execute();

    /* if you aren't hashing the password,
    then do it first
    $psw = PASSWORD_HASH($psw, PASSWORD_DEFAULT);
    */

    // Insert if email not registered
    if($sql->rowCount() == 0) {
        $insert = $pdo->prepare("INSERT INTO User (Nome,Cognome,Email,Username,Password) VALUES (?, ?, ?, ?, ?)");
        $insert->bindParam('1', $nome);
        $insert->bindParam('2', $cognome);
        $insert->bindParam('3', $email);
        $insert->bindParam('4', $nikName);
        $insert->bindParam('5', $psw);
        $insert->execute();
        if($insert->rowCount() > 0) {
            echo "utente registrato correttamente";
        } else {
            echo "errore registrazione, riprovare più tardi";
        }
    } else {
        echo "utente gia registrato";
    }
?>