更好地理解 PHP 和 SQL [关闭]

Posted

技术标签:

【中文标题】更好地理解 PHP 和 SQL [关闭]【英文标题】:Greater understanding of PHP and SQL [closed] 【发布时间】:2013-10-15 00:49:50 【问题描述】:

“过去”我经常使用 phpmysql 来创建各种网站,包括基于文本的游戏。

当我创建这些项目时,我使用的代码如下:

$query = 'SELECT user FROM users WHERE user_id = 1';
$result = mysql_query($query);

从数据库中获取结果。我意识到这是一种非常糟糕的方法,我的问题是现在执行 SELECT、UPDATE、DELETE 等的最佳方法是什么。因为如果我在一个文件中创建函数,这些将在整个网站上使用很快。我想知道这样做的“最佳/最安全”的方式。我知道将 SQL 语句放在一行是不好的,因为它们对 SQL 注入开放,我想知道这究竟意味着什么以及如何安全地解决这个问题。

它主要处理我似乎不明白的数据库。由于我已经有几年没有关注 PHP 了,所以我看到很多事情从我创建项目时开始发生了变化。

我浏览了网络,发现 W3Schools 是一个有用的资源,但我想听听每天都在使用它的人的意见,以了解我应该如何做事。

总的来说,我如何安全地连接数据库以及如何安全地从数据库中获取数据以供整个网站使用。

这包括:

连接数据库 从数据库中获取数据库 将数据库中的数据回显到页面上

以及您能想到的任何其他有助于我了解如何构建“安全”网站的方法。

感谢任何回复此/这些问题的人,我将在 cmets 中非常积极地提出更多关于我不完全理解的问题的问题。

旁注:本网站将使用 htmljavascript、PHP 和 MYSQL 数据库创建。

【问题讨论】:

获取 MVC 框架 你应该找一个例子来告诉你如何使用 MySQLi 和/或 PDO,网上有很多 :) 这些方法与数据封装相结合,使你的应用程序非常安全。 @Ruddy 查看我的更新答案。 MVC 框架是个好主意,但这不是问题的答案。我相信这里的想法是框架往往包含一个 ORM,而这正是你想要的。有几个独立的,例如 Propel 和 Doctrine - 看看它们。 其他值得一提的独立ORM:Idiorm and Paris 【参考方案1】:

都是从Separation of concerns开始的,现在最流行的Web应用架构是Model-View-Controller(你不需要发明一个,你可以使用一些现有的PHP框架,每个框架都捆绑了一些有点像ORM)。

既然您要问的是如何隔离数据库代码,那么模型是您应该从 MVC 范式中学习的第一件事。对数据的所有操作,包括任何业务逻辑和计算,所有数据库操作,都进入模型类。您可以通过不同的方式构建它们。一种流行的模式是Active Record——字面意思是每桌一个班级。我不是这个的忠实粉丝——你可以在你的逻辑实体(用户、游戏等)之后创建类,它们可以在多个表上运行。但无论如何,这些类可能是基于 Active Record 构建的。

如果您正在使用现有代码,您可以从隔离对象中的查询开始,因此所有与数据库一起使用的代码都在一个地方 - 然后您可以开始重构对象以遵循所选架构:用户对象与用户表,等等......在对象中分离数据库代码后,您可以轻松切换到 PDO 或其他数据库实现并防止 SQL 注入。

最后我想推荐几本书: Refactoring - 关于如何将遗留代码转化为漂亮的 OO 解决方案的最佳书籍

Patterns of enterprise application architecture - 难以阅读,但有很多有用的信息

Implementation Patterns - 与设计模式书籍不同,它侧重于小决策,实际上是每一行代码

【讨论】:

如果你的意思是 MVC 框架,像 CodeIgniterCakePHPSymfonyYiiKohana - 它们实际上不是 MVC 框架。它们都实现了类似于 Model-View-Presenter 的东西。 有意思,我可能需要买这些书。另一个问题,因为您似乎对此主题了解很多。您能解释一下“SQL 注入”是什么以及它们是如何工作的吗? @Ruddy,关于什么是 SQL 注入的问题很容易在网上搜索到。那里已经有更多信息,不值得在这里重新输入:) @Ruddy 这是对 SQL 注入的最佳解释之一;)xkcd.com/327 SQL 注入之所以起作用,是因为代码没有正确检查和处理用户输入的内容,从而可能导致某些用户输入的内容实际上包含有效的 sql-code,当您将 user-content-values 和 sql-code 连接在一起时正在执行,以绕过它prepared statements 是您想要使用的 @halfer 显然没有阅读我的帖子。【参考方案2】:

这是值得注意的:

将 SQL 语句放在一行是不好的,因为它们容易受到 SQL 注入的影响

不,一行的 SQL 语句就可以了。 SQL 注入的出现是因为允许用户输入 SQL,而无需检查它本身是否包含(恶意)SQL。要么使用 parameterisation 来防止这种情况(ORM 会为你做到这一点)或 escaping

【讨论】:

哦?我以为前几天我看到了一些关于一条线不好或什么的东西。如果这是真的那么我的错误,谢谢你的回答。【参考方案3】:

尝试寻找 Mysqli Prepare。 这是一个例子:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) 
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();


/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT user FROM users WHERE user_id = ?")) 

    /* bind parameters for markers */
    $stmt->bind_param("s", $id);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($user);

    /* fetch value */
    $stmt->fetch();

    printf("You are %s\n", $user);

    /* close statement */
    $stmt->close();


/* close connection */
$mysqli->close();
?>

这些比mysql_query()更好更安全

【讨论】:

以上是关于更好地理解 PHP 和 SQL [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我没有完全得到“存在”的部分。谁能帮助我更好地理解它? [关闭]

PHP - 从地址获取纬度和经度[关闭]

PHP地理定位API [关闭]

有人可以帮助我更好地理解 Room 持久性库吗?

如何删除 MS SQL Server 存储过程中的 While 循环? [关闭]

ASP.Net (C#) & SQL Server - 或者 - PHP & MySQL 的性能? [关闭]