当我尝试检查电子邮件是否已注册时,我遇到了问题。有人可以帮忙吗?我有这个错误:
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";
}
}
}
?>
答案 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安全模式下,将忽略此参数。
旁注:这是有问题的"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";
}
?>