清理PHP代码

清理PHP代码,php,Php,我注意到我是一个非常草率的程序员,做的事情与众不同 你能看看我的代码,给我一些如何更有效地编写代码的提示吗?我能做些什么来改进 session_start(); /*check if the token is correct*/ if ($_SESSION['token'] == $_GET['custom1']){ /*connect to db*/ mysql_connect('localhost','x','x') or die(mysql_error());

我注意到我是一个非常草率的程序员,做的事情与众不同

你能看看我的代码,给我一些如何更有效地编写代码的提示吗?我能做些什么来改进

session_start();



/*check if the token is correct*/
if ($_SESSION['token'] == $_GET['custom1']){

    /*connect to db*/
    mysql_connect('localhost','x','x') or die(mysql_error());
    mysql_select_db('x');



    /*get data*/

    $orderid = mysql_real_escape_string($_GET['order_id']);
    $amount = mysql_real_escape_string($_GET['amount']);
    $product = mysql_real_escape_string($_GET['product1Name']);
    $cc = mysql_real_escape_string($_GET['Credit_Card_Number']);
    $length = strlen($cc);
    $last = 4;
    $start = $length - $last;
    $last4 = substr($cc, $start, $last);
    $ipaddress = mysql_real_escape_string($_GET['ipAddress']);
    $accountid = $_SESSION['user_id'];
    $credits = mysql_real_escape_string($_GET['custom3']);




    /*insert history into db*/
    mysql_query("INSERT into billinghistory (orderid, price, description, credits, last4, orderip, accountid) VALUES ('$orderid', '$amount', '$product', '$credits', '$last4', '$ipaddress', '$accountid')"); 
    /*add the credits to the users account*/
    mysql_query("UPDATE accounts SET credits = credits + $credits WHERE user_id = '$accountid'");

    /*redirect is successful*/
    header("location: index.php?x=1");
}else{

    /*something messed up*/
    header("location: error.php");
}

您可能希望研究如何使用框架,或者至少使用对象关系映射器

如果您使用的是面向对象的方法,那么SQL操作就非常容易了

例如,在我的框架中,在新用户填写注册表后,只需几行代码即可创建新用户。当然,在对象背后封装了大量代码,以防止任何有趣的业务或黑客企图,但这使它的使用变得非常简单

$account = new Account();
$account->insert(array(
    'userid' => $id,
    'accountpass' => $passhash,
    'accountemail' => $emailhash
));

我没有使用过任何著名的框架或对象关系映射器,但我听说CodeIgniter、Kohana和Doctrine是一些不错的工具。但是,它们有一个学习曲线,因此您应该事先知道您的应用程序是否足够大,是否有必要学习另一个API。

您可能需要研究使用框架,或者至少使用对象关系映射器

如果您使用的是面向对象的方法,那么SQL操作就非常容易了

例如,在我的框架中,在新用户填写注册表后,只需几行代码即可创建新用户。当然,在对象背后封装了大量代码,以防止任何有趣的业务或黑客企图,但这使它的使用变得非常简单

$account = new Account();
$account->insert(array(
    'userid' => $id,
    'accountpass' => $passhash,
    'accountemail' => $emailhash
));

我没有使用过任何著名的框架或对象关系映射器,但我听说CodeIgniter、Kohana和Doctrine是一些不错的工具。不过,它们有一个学习曲线,所以您应该事先知道您的应用程序是否足够大,是否有必要学习另一个API。

您的代码似乎相当标准。您可能应该使用某种类型的缩进,而对于MySQL查询,使用的不仅仅是查询中间的变量。从风格的角度来看,虽然你的代码看起来很标准,但基本上还是不错的。您可能应该使用某种类型的缩进,而对于MySQL查询,使用的不仅仅是查询中间的变量。从风格的角度来看,这基本上是好的,不过这取决于你这里所说的干净。整个过程将从基本缩进中受益匪浅——将现有空白移到更高效的地方。比如,你的换行符分布似乎很不一致。缩进和换行符的一致性大大提高了代码的可读性

在风格的下一个层次上,我明白了为什么您需要在这里分配大量变量,因为您使用的是原始MySQL函数。如果你打算坚持使用这个系统,至少要以合理的顺序分配变量,更不用说我在下面做了一些其他的更改和注释

// Let's just strip all non-numerics from the card number so that we can validate it.
$cc = preg_replace('/[^0-9]/', '', $_GET['Credit_Card_Number']);
if(strlen($cc) != 12) {
    // The card number is invalid; go back to form and try again.
}
$last4 = substr($cc, -4); // A negative start value is cleaner.

$accountid = $_SESSION['user_id'];

$amount = mysql_real_escape_string($_GET['amount']);
$credits = mysql_real_escape_string($_GET['custom3']);
// note: don't trust that users won't change the ipAddress parameter before submitting
$ipaddress = mysql_real_escape_string($_GET['ipAddress']);
$orderid = (int) $_GET['order_id'];
$product = mysql_real_escape_string($_GET['product1Name']);
我把变量赋值分为三个部分。第一个用于数据转换,第二个用于从非GET源获取数据,第三个用于从$\u GET变量进行基本赋值,按字母顺序排序。现在的作业更加结构化,而且很容易找到任何给定的行。当然,这绝不是一种标准的分手方式;这正是有意义的

这就是好代码的全部意义所在——您可以轻松维护好代码。做任何对您最有利的事情,但我怀疑,从长远来看,代码可读性和有组织的变量分配都很有效


另外,正如其他人所提到的,考虑使用类似于数据库操作的东西,这允许您使用准备好的语句并避免所有这些逃避函数。您可能还想研究一个类似ORM的,或者可能是一个成熟的ORM。使用更强大的工具有更高的学习曲线,但一旦精通OOP,也会带来更高的生产率。

取决于您这里所说的“干净”是什么意思。整个过程将从基本缩进中受益匪浅——将现有空白移到更高效的地方。比如,你的换行符分布似乎很不一致。缩进和换行符的一致性大大提高了代码的可读性

在风格的下一个层次上,我明白了为什么您需要在这里分配大量变量,因为您使用的是原始MySQL函数。如果你打算坚持使用这个系统,至少要以合理的顺序分配变量,更不用说我在下面做了一些其他的更改和注释

// Let's just strip all non-numerics from the card number so that we can validate it.
$cc = preg_replace('/[^0-9]/', '', $_GET['Credit_Card_Number']);
if(strlen($cc) != 12) {
    // The card number is invalid; go back to form and try again.
}
$last4 = substr($cc, -4); // A negative start value is cleaner.

$accountid = $_SESSION['user_id'];

$amount = mysql_real_escape_string($_GET['amount']);
$credits = mysql_real_escape_string($_GET['custom3']);
// note: don't trust that users won't change the ipAddress parameter before submitting
$ipaddress = mysql_real_escape_string($_GET['ipAddress']);
$orderid = (int) $_GET['order_id'];
$product = mysql_real_escape_string($_GET['product1Name']);
我把变量赋值分为三个部分。第一个用于数据转换,第二个用于从非GET源获取数据,第三个用于从$\u GET变量进行基本赋值,按字母顺序排序。现在的作业更加结构化,而且很容易找到任何给定的行。当然,这绝不是一种标准的分手方式;这正是有意义的

这就是好代码的全部意义——它是 易于维护。做任何对您最有利的事情,但我怀疑,从长远来看,代码可读性和有组织的变量分配都很有效


另外,正如其他人所提到的,考虑使用类似于数据库操作的东西,这允许您使用准备好的语句并避免所有这些逃避函数。您可能还想研究一个类似ORM的,或者可能是一个成熟的ORM。使用功能更强大的工具具有更高的学习曲线,但一旦精通OOP,也会提高生产率。

通过GET传递信用卡号和IP地址不是很安全,包含GET字符串的URL可能会保留在浏览器历史记录中。您如何分配$\u GET['ipAddress']?您应该改用$\u SERVER['REMOTE\u ADDR']

要获取信用卡的最后4位数字,您可以通过执行以下操作保存几行代码:


$last4=substr$cc,-4

通过GET传递信用卡号和IP地址不是很安全,包含GET字符串的URL可能会保留在浏览器历史记录中。您如何分配$\u GET['ipAddress']?您应该改用$\u SERVER['REMOTE\u ADDR']

要获取信用卡的最后4位数字,您可以通过执行以下操作保存几行代码:


$last4=substr$cc,-4

我首先想到的是,你的代码中有一个相当大的安全漏洞。通过将$\u GET变量直接放入SQL查询中,您将面临各种各样的攻击。此外,由于它似乎在使用get数据进行计费,所以可以通过使用get变量来操纵自己的帐户余额


我建议在将传入的GET数据转储到数据库之前对其进行一些数据检查。

我首先想到的是,您的代码中存在一个相当大的安全漏洞。通过将$\u GET变量直接放入SQL查询中,您将面临各种各样的攻击。此外,由于它似乎在使用get数据进行计费,所以可以通过使用get变量来操纵自己的帐户余额


我建议在将传入的GET数据转储到数据库之前对其进行一些数据检查。

我要补充的是,每当您看到自己重复相同的操作时,您可能需要创建一个函数

如果明天你想改变转义数据的方式,你必须编辑所有使用mysql\u real\u escape\u string的行

为什么不添加一个函数,例如

function escape_data($data) {
    $escaped_data = mysql_real_escape_string($data);
    // room for more actions ...
    return ($escaped_data);
}
此外,如果您将相同的函数应用于此处$\u GET的数组的所有成员,您可能会发现array\u map很有用:


我想补充一点,每次您看到自己重复相同的操作时,您可能需要创建一个函数

如果明天你想改变转义数据的方式,你必须编辑所有使用mysql\u real\u escape\u string的行

为什么不添加一个函数,例如

function escape_data($data) {
    $escaped_data = mysql_real_escape_string($data);
    // room for more actions ...
    return ($escaped_data);
}
此外,如果您将相同的函数应用于此处$\u GET的数组的所有成员,您可能会发现array\u map很有用:


如果最终用户键入连字符或空格int 4016 5432 1234=4016Hm,则将$GET['Credit\u Card\u Number']强制转换为整数将不会太好,除非事先进行一些表单验证。我会进行编辑,但我不太确定如果不为OP编写整个验证,我会将其编辑成什么,因为我也不想鼓励像将信用卡号存储为字符串这样的愚蠢行为。它显然只需要将所有非数字字符剥离并存储为整数;也许我会为此编写一些代码。@deadkarma:basic-validation添加。Luhn算法并不麻烦,因为我假设他在实际处理支付时使用的任何方法都是这样。除非事先进行某种形式的验证,否则如果最终用户键入连字符或空格int 4016 5432 1234=4016Hm,则将$GET['Credit\u Card\u Number']转换为整数将不会太好。我会进行编辑,但我不太确定如果不为OP编写整个验证,我会将其编辑成什么,因为我也不想鼓励像将信用卡号存储为字符串这样的愚蠢行为。它显然只需要将所有非数字字符剥离并存储为整数;也许我会为此编写一些代码。@deadkarma:basic-validation添加。Luhn算法并不麻烦,因为我假设他实际处理付款的任何方式都是这样。这不是我的选择,我的CRM通过GET将订单中的所有信息传递到我的成功页面,包括IP地址。这不是我的选择,我的CRM通过GET将订单中的所有信息传递到我的成功页面,这包括IP地址。我以前用过Codeigniter,但我不太喜欢它。查找PDO::fetchObject for OR mapping-它让生活变得更简单。我以前用过Codeigniter,但我不太喜欢它。查找PDO::fetchObject for OR mappi
这让生活变得容易多了。谢谢你,我会调查的!谢谢,我会调查的!啊,打得好。我想如果$product==铜牌{$credits=400;}elseif$product==银牌{$credits=1042;}elseif$product==黄金{$credits=2275;}elseif$product==白金$credits=5000,我可以检查每个包有多少积分;}但是他们仍然可以更改包名。你建议怎么做?你是否可以避免发送信用信息?您可以将每种产品的积分存储在某个数据库中并使用该数据。此外,确保产品仅包含字母和数字,这将阻止许多攻击,其中最有可能包含逗号etcAhh,good call。我想如果$product==铜牌{$credits=400;}elseif$product==银牌{$credits=1042;}elseif$product==黄金{$credits=2275;}elseif$product==白金$credits=5000,我可以检查每个包有多少积分;}但是他们仍然可以更改包名。你建议怎么做?你是否可以避免发送信用信息?您可以将每种产品的积分存储在某个数据库中并使用该数据。此外,确保产品仅包含字母和数字,这将阻止大量攻击,其中最有可能包含逗号等