0

我有一个非常令人沮丧的问题。我有一个向服务器发送注册表单的客户端。处理程序是一个 php 文件。

问题如下:客户端将表单数据发送到php,php将其存储在mysql数据库中。但是如果我尝试给出一个包含空格的名称 - 我不知道为什么 - 在数据库中密码的长度减少了两个。

我搜索了很长时间,但一无所获。我正处于疯狂的边缘,所以我想请你帮我找出问题所在。

这是注册表:

<!-- REGISTRATION -->
    <div data-role="page" id="regScreen">
        <div data-role="content">
            <div class="profileCircle">
                <img src="img/iskola.jpg" />
            </div>
            <div class="space"></div>
            <form action="" method="post" id="regForm" name="regForm">
                <input type="text" name="nev" id="regName" placeholder="Teljes név" data-mini="true"/>
                <input type="email" name="mail" id="regEmail" placeholder="Email cím" data-mini="true"/>
                <input type="password" name="jelszo" id="regPassword" placeholder="Jelszó" data-mini="true"/>
                <input type="submit" data-inline="true" data-mini="true" value="Regisztráció" name="rendben" id="rendben" />
            </form>
        </div>
        <a href="#loginScreen"><div class="circle leftBottom c1">
            <img src="img/ikonok/vissza.png" />
        </div></a>
    </div>

这是应该在客户端处理注册的脚本:

function registration(){
var name = $('#regForm #regName').val();
var email = $('#regForm #regEmail').val();
var password = $('#regForm #regPassword').val();
if((password == "" || password == null) || (email == "" || email == null)){
    navigator.notification.alert("Nem töltött ki minden adatot!", function(){}, "Figyelem!");
}else{
    $.ajax({
        url: host + "regisztracio.php",
        type: 'post',
        dataType: 'json',
        data: {rendben:'ok', nev: name, mail: email, jelszo: password},                      
        success: function(data){
            if(data.ok){
                    navigator.notification.alert('Sikeresen regisztrált!\nMostmár be tud jelentkezni a saját felhasználónevével!',function(){
                    $.mobile.changePage("#loginScreen");
                },'Üdvözöljük!');
            }else{
                navigator.notification.alert(data.uzenet,function(){},'Figyelem!');
                if(data.help){
                    navigator.notification.confirm('Kívánja, hogy új jelszót küldjünk erre az email címre?',function(){
                        console.log(button);
                    }, 'Segíthetünk?', 'Igen, Nem');
                }
            }
        },
        error: function(err){
            console.log('jajj');
            navigator.notification.alert(err.message,function(){},'Hiba!');
        }
    });
}
}

最后是php代码:

<?php
if (isset($_POST['rendben'])) {

require("mysql.php");

$nev   = $_POST['nev'];
$mail = $_POST['mail'];
$jelszo = $_POST['jelszo'];

if (empty($_POST['nev']) OR empty($_POST['mail']) OR empty($_POST['jelszo'])) { 
    $string = array("ok" => false, "uzenet" => "Nem töltött ki minden adatot!");
    echo json_encode($string);
}else{
    $sql = "SELECT *
        FROM felhasznalok
        WHERE mail = '{$mail}'";
    $eredmeny = mysql_query($sql);
    if (mysql_num_rows($eredmeny) == 0) {
        $sql = "INSERT INTO felhasznalok
                (nev, mail, jelszo, kep)
                VALUES
                ('{$nev}', '{$mail}', '{$jelszo}', '{$kep}')";
        mysql_query($sql);
        $string = array("ok" => true);
        echo json_encode($string);
    }else{
        $string = array("ok" => false, "help" => true, "uzenet" => "Ezzel az email címmel már regisztráltak, lehet, hogy elfelejtette a jelszavát?");
        echo json_encode($string);
    }
}
}?>

如果您需要,我将从数据库表中上传一张图片。

我希望你能帮助我。

4

2 回答 2

1

请原谅不是完整的答案,但格式比评论更好:

正如其他人已经建议的那样:

  1. 回显您的 sql 语句。毕竟这是存储在数据库中的内容。这将显示您的问题是在数据存储在数据库之前还是之后。

  2. var_dump($_POST) 如果你的 sql 很好,因为这会检查数据接收和数据库中存储之间的代码 - 你可以看到你的脚本实际发送的内容。

  3. 转义文本以防止“sql 注入” - 始终转义文本,因为您永远不知道何时要更改客户端页面,这样更安全。您的案例是为什么您从不信任来自客户的数据的一个典型例子。

FWIIW,我怀疑问题出在javascript上。使用像 jquery 这样的库的一个问题是它们实际上并没有让简单的事情变得更容易。它们使它变得更复杂。有点像计算尺,一旦学会了,他们做一些复杂的东西并不比简单的东西难。还有一个代码可移植性的好处。

即便如此,恕我直言,对于一个简单的 ajax 调用,您实际上最好使用纯 JS,当然作为初学者。w3schools.com 有一个优秀的 AJAX 教程和代码示例。

mysql_* 扩展已被弃用。学习 mysqli_ (几乎相同)或 PDO 是明智的。

于 2013-06-09T20:12:05.507 回答
0

我的猜测是您在jQuery.param编码空格(+,一个字符,而不是 %20,三个字符)时遇到问题。

您可以尝试使用以下设置手动将密码字段中的“”替换为“%20”(注意:您可能在所有字段中都有相同的问题,只是您还没有注意到):.beforeSend

url: host + "regisztracio.php",
    type: 'post',
    dataType: 'json',
    data: {rendben:'ok', nev: name, mail: email, jelszo: password},     
    beforeSend: function (req, data) {
        data.jelszo = data.jelszo.replace(/\+/g, "%20");
    },
    success: function(data){
        ...

此外(但这是不相关的),在 PHP 方面,请注意您可以简化一点代码以仅在一个地方对答案进行编码:

$string = array("ok" => false);

// Ez ad némi biztonságot
$fields = array('nev','mail','jelszo');
foreach($fields as $field)
{
    if (empty($_POST[$field]))
        $string['uzenet'] = "Nem töltött ki minden adatot: ${field}!";
    else
        ${$field} = mysql_real_escape_string($_POST[$field]);
}
if (!isset($string['uzenet']) {
    $sql = "SELECT *
        FROM felhasznalok
        WHERE mail = '{$mail}'";
    $eredmeny = mysql_query($sql);
    if (mysql_num_rows($eredmeny) == 0) {
        $sql = "INSERT INTO felhasznalok
                (nev, mail, jelszo, kep)
                VALUES
                ('{$nev}', '{$mail}', '{$jelszo}', '{$kep}')";
        if (false === mysql_query($sql))
            $string['uzenet'] = 'Volt egy adatbázis hiba!';
        else
            $string['ok'] = true;
    }else{
        $string['help'] = true;
        $string['uzenet'] = 'Ezzel az email címmel már regisztráltak, lehet, hogy elfelejtette a jelszavát?';
    }
}
die(json_encode($string)); // No more output after this.
于 2013-06-09T20:35:30.613 回答