0

我已经编写了以下代码并发布了数据,因为我可以在控制台中看到它。但是,它似乎没有添加到数据库中。我认为这可能是我在 process.php 文件中的操作条件:add_new,但我不确定。

在 PHP 上不是一个大人物,所以不确定如何看到它失败的原因,但它成功返回到 AJAX,我认为但没有添加到数据库,所以我认为这可能是我上面所说的。

if($_POST['action'] == "add_new"){

jQuery 和表单:

<script type="text/javascript">
    $(document).ready(function(){
        $('div.success').hide();    
        $("form#add_new").submit(function() {
            var started = "<?php echo time(); ?>";
        var duration = $('#duration').val();
        var ticket_price = $('#ticket_price').val();
        var win_percentage = $('#win_percentage').val();
        var description = $('#description').val();
        var available = $('#available').val();
        var action = "add_new";

        $.ajax({
            type: "POST",
            url: "/admin/process.php",
            data: { started: started, duration: duration, ticket_price: ticket_price, win_percentage: win_percentage, description: description, available: available, action: action },
            dataType: 'json',
            success: function(data){
                    $('form#add_new').hide(function(){$('div.success').fadeIn();});
            }
        });
        return false;
        });
    });

<div class="success">successfully added new ticket</div>
    <form id="add_new" method="post" class="form-horizontal">
        <fieldset>
            <div class="control-group">
                  <label for="duration" class="control-label">Duration (days)</label>
                  <div class="controls">
                    <input type="text" id="duration" class="input-xlarge" value="" />
                  </div>
                </div>
                <div class="control-group">
                  <label for="ticket_price" class="control-label">Ticket Price</label>
                  <div class="controls">
                    <input type="text" id="ticket_price" name="ticket_price" class="input-xlarge" value="" />
                  </div>
                </div>
                <div class="control-group">
                  <label for="available" class="control-label">Available to be Won(%)</label>
                  <div class="controls">
                    <input type="text" id="available" name="available" class="input-xlarge" value="" />
                  </div>
                </div>
                <div class="control-group">
                  <label for="win_percentage" class="control-label">Percentage of Winners</label>
                  <div class="controls">
                    <input type="text" id="win_percentage" name="win_percentage" class="input-xlarge" value="" />
                  </div>
                </div>
                <div class="control-group">
                  <label for="description" class="control-label">Description</label>
                  <div class="controls">
                    <textarea rows="4" id="description" name="description" class="input-xlarge"></textarea>
                    <span class="help-block">Automatic resize</span> </div>
                </div>
                <div class="control-group">
                  <div class="controls">
                    <button class="btn btn-gebo" type="submit">Save changes</button>
                  </div>
                </div>
              </fieldset>
            </form>

process.php

<?php

include "../utils.php"; 

// Add new raffle ticket
if($_POST['action'] == "add_new"){
    $started = $_POST['started'];
    $duration = $_POST['duration']; 
    $ticket_price = $_POST['ticket_price'];
    $win_percentage = $_POST['win_percentage'];
    $description = mysql_real_escape_string($_POST['description']);
    $available = $_POST['available'];

    my_query("INSERT INTO " . $db_prefix . " (lotteries(started, duration, ticket_price, win_percentage, description,available) values) VALUES ('$started','$duration','$ticket_price','$win_percentage','$description','$available')");
    mysql_query($add_to_shelf) or die(mysql_error());
}
?>
4

3 回答 3

0

有太多错误,但首先没有调用函数my_query。在 PHP 中的倒数第二行。如果我是你,我会首先使用基本的 GET 变量或其他东西检查 PHP 代码是否正常工作,然后处理 POST 变量。

完成后,您的代码将受到mysql injection的影响。您需要查看停止这些已弃用mysql_的功能并转移到受支持的类型,例如PDO.

于 2013-06-15T21:02:06.613 回答
0

首先,我建议

1)检查您的 PHP 是否被调用 2)检查它在做什么以及结果是什么。

如果您没有这样做的工具箱,这里有一些有用的功能:

function PrintLog($string)
{
    if (! BDEBUG)
        return ;

    $logDir = LOGPATH;
    if (! file_exists($logDir))
    {
        umask(000);
        if (! mkdir($logDir, 0777))
            ErrorLog("Failed to create Directory $logDir");
        chmod($logDir, 0777);
    }

    $fplog = @fopen($logDir.'/'.'debug-'.date('Y-m-d').'.log', 'a');
    if ($fplog)
    {
        fwrite($fplog, date("d-m-Y  H:i:s")."\t".$string);
        fwrite($fplog, "\n");
        fclose($fplog);
    }
}
function PrintrLog(&$arrayToDump, $strName = '')
{
    ob_start();
    print_r($arrayToDump);
    PrintLog("$strName = ".ob_get_contents());
    ob_end_clean();
}

在您的 PHP 脚本中插入这些函数和代码:

define("BDEBUG", true);
define("LOGPATH", "./log/");
PrintrLog( $_POST);

然后,查看生成的日志文件。如果没有,请查看您的 Apache 日志,可能会有一些错误在这里等待您修复。如果日志在这里,请检查 POST 是否应该是这样,那么这可能是您的 SQL 中的问题。我不太了解您的数据库架构,但直观地说,我会写更多类似的东西:

$my_query = "INSERT INTO lotteries (started, duration, ticket_price, win_percentage, description,available) VALUES ('$started', '$duration', '$ticket_price', '$win_percentage', '$description', '$available')"; 
PrintLog($my_query); // Take it from logs, and run it manually inPHPmyAdmin to debug it eaily

您也可以在工具箱中添加这种功能:

function ExecQuery($Cnx, $baseName, $query, &$sqlError)
{
    PrintLog($query);
    $result = mysql_query($query, $Cnx);
    if (! $result)
    {
        $sqlError = "ERROR: Failed to execute query '$query' [".mysql_errno().': '.mysql_error().']';
        PrintLog($sqlError); 
        return false;
    }
    return $result;
} 

我希望这将对您当前和未来的调查有所帮助;-)

PS:您还应该考虑使用这样的功能来系统地避免SQL注入:

function getPostValue($name) {
    if (! isset($_POST[$name]))
        return '';
    return(mysql_real_escape_string($_POST[$name]));
}
于 2013-06-15T22:06:09.190 回答
0

我相信上帝是对的。使用 PDO 更安全。这是一个关于如何插入数据库的简短示例:

$stmt = $dbo->prepare("INSERT INTO customer (name, email, password)
            VALUES (:name, :mail, :pass)");
            $stmt->bindParam(':name', $_POST['full_name']);
            $stmt->bindParam(':mail', $_POST['email']);
            $stmt->bindParam(':pass', $_POST['password']);

            $stmt->execute();   
于 2013-06-15T22:11:10.400 回答