【问题标题】:Proper way of connecting to SQL with PHP and PDO使用 PHP 和 PDO 连接 SQL 的正确方法
【发布时间】:2015-08-13 16:41:31
【问题描述】:

这是一个托管在我的 Web 服务器上的 php 文件,它连接到 SQL 数据库。创建帐户功能有效,但是一旦将值放入表中,我就会遇到问题。只是为了获得更多上下文,我在游戏制造商中使用 http_get() 函数:http://docs.yoyogames.com/source/dadiospice/002_reference/asynchronous%20functions/http_get.html

我的 SQL 表有 4 列:
P-ID - 一个自动递增的主键
USER - 用户名值
PASS - 加密密码值
SaveString - 最重要的值是我试图从我创建的游戏中访问的字符串。 这个系统有点工作,但我决定将其更改为 PDO 并作为 PHP 新手

<?php


    $mysql_server = "server";
    $mysql_username = "username";
    $mysql_password = "password";
    $mysql_database = "database";
    $mysql_table = "table"; 


    try{
        $conn = new PDO("mysql:host=$mysql_server;dbname=$mysql_database", $mysql_username, $mysql_password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e){
        echo "Couldn't connect to database";
    }

    $f = $_GET['f']; //function operator
    $puser = $_GET['puser'];
    $pword = $_GET['pword'];
    $pss =  $_GET['pss'];



    $salt = "supersecretsalt"; // Super secret encoder
    $epword = crypt($pword,$salt);


    function create_account($conn, $mysql_table, $puser, $epword, $pss) 
    {
        try{
            $sql = "INSERT INTO $mysql_table (USER, PASS, SaveString) VALUES('$puser','$epword','$pss') ";
            $conn->exec($sql);
        } catch (PDOException $e){
            echo "exception connecting to server";
        }
        $conn = null;
    }
    // This function will save information to an existing account
    function save_info($conn, $mysql_table, $puser, $pword, $pss)
    {   
        try{
            $sql = "UPDATE $mysql_table SET SaveString = $pss  WHERE USER = '$puser'";
            $conn->exec($sql);
        } catch (PDOException $e){
            echo "Save didn't work";
        }
        $conn = null;
    }
    // This function will pull account information
    function load_info($conn, $mysql_table, $puser, $epword)
    {
        try{
            $statement = $conn->prepare("SELECT * FROM $mysql_table WHERE USER = '$puser' AND PASS = '$epword'");
            $statement->execute();
            $row = $statement->fetch();
            echo $row['SaveString'];
        } catch(PDOException $e){
            echo "0";
        }
        $conn = null;
    }


    // This determines which function to call based on the $f parameter passed in the URL.
    switch($f)
    {
        case na: create_account($conn, $mysql_table, $puser, $epword, $pss); break;
        case sv: save_info($conn, $mysql_table, $puser, $epword, $pss); break;
        case ld: load_info($conn, $mysql_table, $puser, $epword); break;
    break;
            default: echo"error";
    }

    ?>

【问题讨论】:

  • 发生了什么?错误信息?另请注意,由于您切换到 PDO,您应该使用准备好的语句来避免注入。 stackoverflow.com/questions/60174/…
  • 是的,这很好。目前它所做的只是说“错误”,没有其他反馈。我只知道它不起作用。

标签: php mysql pdo


【解决方案1】:

switch 语句的大小写应该用引号引起来,因为它们是字符串。您的最后一个case 上还有一个额外的break。试试这个,

switch($f) {
     case 'na': 
          create_account($conn, $mysql_table, $puser, $epword, $pss); 
     break;
     case 'sv': 
          save_info($conn, $mysql_table, $puser, $epword, $pss); 
     break;
     case 'ld': 
          load_info($conn, $mysql_table, $puser, $epword); 
     break;
     default: 
          echo "error";
}

$f 的情况也很重要,如果它是NA,它仍然会失败。为确保它始终为小写,您可以使用 strtolower,http://php.net/strtolower,例如 switch(strtolower($f)) {。您也可以选择放入多个案例,但这似乎是一种浪费,例如,

case 'na': 
case 'NA':

虽然nA 和Na 仍然没有考虑到这种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2017-03-11
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多