即使使用mysql_real_escape_string()函数,是否存在SQL注入的可能性?
考虑这个示例情况.SQL是用PHP构造的,如下所示:
$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));
$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";
Run Code Online (Sandbox Code Playgroud)
我听过很多人对我说,这样的代码仍然很危险,即使使用了mysql_real_escape_string()函数也可以破解.但我想不出任何可能的漏洞?
像这样的经典注射:
aaa' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)
不工作.
你知道任何可能通过上面的PHP代码注入的注入吗?
我知道你可以一次插入多行,有没有办法在MySQL中一次更新多行(如在一个查询中)?
编辑:例如我有以下内容
Name id Col1 Col2
Row1 1 6 1
Row2 2 2 3
Row3 3 9 5
Row4 4 16 8
Run Code Online (Sandbox Code Playgroud)
我想将以下所有更新组合到一个查询中
UPDATE table SET Col1 = 1 WHERE id = 1;
UPDATE table SET Col1 = 2 WHERE id = 2;
UPDATE table SET Col2 = 3 WHERE id = 3;
UPDATE table SET Col1 = 10 WHERE id = 4;
UPDATE table SET Col2 = 12 WHERE id = 4;
Run Code Online (Sandbox Code Playgroud) 我正在为我正在开发的应用程序创建一个安装脚本,需要在PHP中动态创建数据库.我已经有了它来创建数据库,但现在我需要加载几个.sql文件.我曾打算一次打开文件和mysql_query一行 - 直到我查看模式文件并意识到它们不是每行一个查询.
那么,我如何从PHP中加载一个sql文件(如phpMyAdmin的import命令)?
我*.sql在创建新的网站数据库时使用了两个文件.第一个文件创建所有表.第二个文件填充一些默认记录.我想从PHP执行这些文件.我也使用Zend_Framework,如果这将有助于实现这一目标.
附加信息
解
使用shell_exec()......
$command = 'mysql'
. ' --host=' . $vals['db_host']
. ' --user=' . $vals['db_user']
. ' --password=' . $vals['db_pass']
. ' --database=' . $vals['db_name']
. ' --execute="SOURCE ' . $script_path
;
$output1 = shell_exec($command . '/site_db.sql"');
$output2 = shell_exec($command . '/site_structure.sql"');
Run Code Online (Sandbox Code Playgroud)
...我从来没有得到有用的输出,但在另一个线程上遵循一些建议,最后让它全部工作.我切换到命令的格式,而不是执行文件.--option=value--execute="SOURCE ..."<
此外,我从来没有得到shell_exec()和和之间的差异的良好解释exec().
从PHP版本5.3开始,PDO_MYSQL驱动程序一直受到支持PDO_MYSQLND.它引入了对多个查询的支持.
但是,如果SELECT传递了多个查询,我无法弄清楚如何获取两个结果集.两个查询都已执行,不能是第二个查询刚刚被转储.
$db->query("SELECT 1; SELECT 2;")->fetchAll(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
返回:
array(1) {
[0]=>
array(1) {
[1]=>
string(1) "1"
}
}
Run Code Online (Sandbox Code Playgroud) 我有很大的问题(对我而言)
我需要DELIMITER |从PHP 执行MySQL命令,但mysql_query()失败并出错.我发现mysql_query()不支持使用DELIMITER,因为这个命令只适用于MySQL控制台
但是当我打开phpMyAdmin时,有一个选项可以在SQL选项卡上更改DELIMITER并且它可以工作,但我不知道如何.
是否可以从PHP更改分隔符?在调用CREATE TRIGGER使用多个命令的命令之前我需要它;.
下面的第二个SQL语句在phpMyAdmin中返回错误:
SET @num=2000040;
INSERT INTO artikel( artikel_nr, lieferant_nr, bezeichnung_1, bezeichnung_1 )
SELECT @num := @num +1 AS anum, 70338, f2, f3
FROM import
WHERE id >1
Run Code Online (Sandbox Code Playgroud)
MySQL说:
#1110 - Column 'bezeichnung_1' specified twice
Run Code Online (Sandbox Code Playgroud)
全对了.但是,当我使用此函数在Symfony 1.4中运行查询时:
// run sql query
// http://erisds.co.uk/symfony/snippet-creating-debugging-complex-sql-queries-in-symfony
// http://stackoverflow.com/questions/5434702/php-quick-refactoring
// param $sql: the query to run
// param $silent: bool if errors should be ignored
// throws: pdo error info if statement failed and $silent=false
// returns: pdo-statement (use for looping over result rows and error …Run Code Online (Sandbox Code Playgroud) 如何通过对一个jquery进行多个查询来获取多个表数据dataTable。我想获取多个查询的多个表数据到一个数据表。我可以根据我的代码执行一个查询吗,我尝试了MySQL UNION,不适合我。
Fetch.php
$query1 = "SELECT SUM(score) AS marks, from_date FROM table1 WHERE stat = 0 GROUP BY name ";
$statement = $db->prepare($query1);
$statement->execute();
$output = array('data' => array());
$count = $statement->rowCount();
if($count > 0) {
while($row = $statement->fetch(PDO:: FETCH_OBJ)) {
$score = $row->marks;
$date = $row->from_date;
$Team = "Team 1";
$output['data'][] = array( $score,$date,$Team);
} // /while
}// if num_rows
$query2 = "SELECT SUM(marks) AS marks, from_date FROM table2 WHERE stat = 0 GROUP BY name "; …Run Code Online (Sandbox Code Playgroud) 我正在使用PDO运行多个查询.如果第二个查询失败,则抛出异常.
$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "
DELETE FROM car;
INSERT INTO car(name, type) SELECT name, from FROM vehicle;
";
try {
$db->exec($sql);
}
catch (PDOException $e)
{
echo $e->getMessage();
die();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码执行时没有抛出异常.
如何确保所有查询都已成功运行?如何查看哪些查询失败?
PS我正在使用PDO多查询来运行MySQL转储,但任何有效的.sql文件都应该有效.
<?php
$query1 = "CREATE VIEW current_rankings AS SELECT * FROM main_table WHERE date = X";
$query2 = "CREATE VIEW previous_rankings AS SELECT rank FROM main_table WHERE date = date_sub('X', INTERVAL 1 MONTH)";
$query3 = "CREATE VIEW final_output AS SELECT current_rankings.player, current_rankings.rank as current_rank LEFT JOIN previous_rankings.rank as prev_rank
ON (current_rankings.player = previous_rankings.player)";
$query4 = "SELECT *, @rank_change = prev_rank - current_rank as rank_change from final_output";
$result = mysql_query($query4) or die(mysql_error());
while($row = mysql_fetch_array($result)) {
echo $row['player']. $row['current_rank']. $row['prev_rank']. $row['rank_change'];
} …Run Code Online (Sandbox Code Playgroud) mysql ×9
php ×8
pdo ×3
sql ×3
scripting ×2
import ×1
security ×1
sql-update ×1
string ×1
while-loop ×1