我一直试图弄清楚我得到的一系列查询有什么问题,而我现在只是感到困惑.
它应该在一个存储过程中,由GUI应用程序调用.
只有一个"微小"的问题,它首先是一个简单的问题UPDATE
,然后是一个INSERT
使用SELECT
带有子选择的问题,最后是另一个问题UPDATE
.手动运行这些查询我得到的总执行时间为0.057秒,而不是太破旧.
现在,我尝试使用这些查询创建一个存储过程和五个输入变量,我运行此过程并在第一次尝试时花了47.096s,随后调用它显示类似的执行时间(35到50秒).从MySQL Workbench运行各个查询仍然显示执行时间小于0.1秒
这些查询确实没有什么花哨的东西,那么为什么存储过程需要永久执行而查询本身只需要几分之一秒?我在这里缺少什么样的MySQL特性吗?
其他测试结果:
似乎如果我在MySQL Workbench中运行查询但是使用变量而不是仅仅将变量的值放在查询中它运行的速度和存储过程一样慢.因此,我尝试将存储过程更改为仅使用静态值而不是变量,突然间它的速度非常快.显然,使用一个变量使得它运行非常缓慢(例如,第一某种原因UPDATE
查询从三个变量,大约需要0.98s去,当我用变量的值直接在查询中,不论它是在以0.04-0.05s存储过程或直接运行查询).
所以,问题不在于存储过程,而是与我使用变量有关(这是不可避免的).
我试图创建一个具有倍数的存储过程CASE STATEMENTS我有以下存储过程:
BEGIN
CASE @olds
WHEN 'emp' THEN
CASE @news
WHEN 'loc' THEN
UPDATE equipos SET pe=pe-1,pg=pg+1 WHERE id=@eqloc;
UPDATE equipos SET pe=pe-1,pp=pp+1 WHERE id=@eqvis;
UPDATE partidos SET `eqgan`=@news WHERE id=@mst;
UPDATE log_partidos SET `status`=@news WHERE `match`=@mst;
WHEN 'vis' THEN
UPDATE equipos SET pe=pe-1,pg=pg+1 WHERE id=@eqvis;
UPDATE equipos SET pe=pe-1,pp=pp+1 WHERE id=@eqloc;
UPDATE partidos SET `eqgan`=@news WHERE id=@mst;
UPDATE log_partidos SET `status`=@news WHERE `match`=@mst;
END CASE;
WHEN 'loc' THEN
CASE @news
WHEN 'emp' THEN
UPDATE equipos SET pe=pe+1,pg=pg-1 WHERE id=@eqloc; …
Run Code Online (Sandbox Code Playgroud) UPDATE items SET name = 'haha' WHERE id = '12'
Run Code Online (Sandbox Code Playgroud)
我很好奇如果where条件失败,update也会插入值.我读过w3schools,只更新数据库中的现有数据更新,但在我的脚本上,它会自动插入包含数据的行.我想知道它是否可能是脚本中的错误,或者只是UPDATE如何在mysql上运行.
你有SQL Server上的T-SQL,Oracle上的PL/SQL,MySQL上的编程语言是什么?
我有两个简单的表:(这里只有"id"列)
表格1:
id
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
表2:
id
2
4
Run Code Online (Sandbox Code Playgroud)
sql查询应比较表2中缺少"id"的两个表并返回:1,2
有任何想法吗?:) TY
我搜索了很多页面的Google搜索结果以及此处的stackoverflow,但找不到适合我情况的解决方案.我似乎只在我试图构建的函数中有一个最后的障碍,它使用call_user_func_array来动态创建对象.
我得到的可捕获的致命错误是Object of class Product could not be converted to string
.当错误发生时,在日志中我得到其中五个(每个参数一个):PHP Warning: Missing argument 1 for Product::__construct(),
在可捕获的致命错误之前.
这是函数的代码:
public static function SelectAll($class, $table, $sort_field, $sort_order = "ASC")
{
/* First, the function performs a MySQL query using the provided arguments. */
$query = "SELECT * FROM " .$table. " ORDER BY " .$sort_field. " " .$sort_order;
$result = mysql_query($query);
/* Next, the function dynamically gathers the appropriate number and names of properties. */
$num_fields = mysql_num_fields($result); …
Run Code Online (Sandbox Code Playgroud) 我总是做简单的连接mysql_connect
,mysql_pconnect
:
$db = mysql_pconnect('*host*', '*user*', '*pass*');
if (!$db) {
echo("<strong>Error:</strong> Could not connect to the database!");
exit;
}
mysql_select_db('*database*');
Run Code Online (Sandbox Code Playgroud)
虽然使用这个我一直使用的简单的方法,使查询之前逃脱的任何数据,不管是INSERT
,SELECT
,UPDATE
或者DELETE
通过使用mysql_real_escape_string
$name = $_POST['name'];
$name = mysql_real_escape_string($name);
$sql = mysql_query("SELECT * FROM `users` WHERE (`name` = '$name')") or die(mysql_error());
Run Code Online (Sandbox Code Playgroud)
现在我明白这在某种程度上是安全的!
它逃脱了危险的人物; 但是,它仍然容易受到其他可能包含安全字符的攻击,但可能对显示数据或在某些情况下恶意修改或删除数据有害.
所以,我搜索了一下,发现了PDO,MySQLi和准备好的语句.是的,我可能会迟到,但我已经阅读了很多很多教程(tizag,W3C,博客,谷歌搜索),没有一个人提到这些.看起来很奇怪为什么,因为只是逃避用户输入真的不安全而且至少可以说是不好的做法.是的,我知道你可以使用Regex解决它,但是,我很确定这还不够吗?
据我所知,当用户输入给出变量时,使用PDO /预处理语句是一种更安全的方式来存储和检索数据库中的数据.唯一的麻烦是,切换(特别是在我的方式/先前编码的习惯非常困难之后)有点困难.
现在我明白使用PDO连接到我的数据库我会使用
$hostname = '*host*';
$username = '*user*';
$password = '*pass*';
$database = '*database*'
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
if ($dbh) {
echo …
Run Code Online (Sandbox Code Playgroud) 我刚刚重新安装了Windows 7,我正试图让我的开发环境重新启动并运行.XAMPP安装正常,我的应用程序在htdocs中,所有数据库都已导入正常.我可以在phpMyAdmin中查看它们,一切看起来都完好无损.
尝试运行应用程序时,查询速度很慢,大多数页面在所有查询完成之前都会超时.
例如,此计算机可以在3秒之前生成的页面,现在最多30秒,页面超时.
这是一个XAMPP安装1.7.7,但我已经尝试回滚到他们的旧版本并获得相同的结果.
日志文件中没有任何内容,因为它实际上并没有错误输出,它只是非常缓慢地执行查询.
即使通过phpMyAdmin导航数据库也需要大约3-10秒来加载页面,而以前只是即时.所以这消除了我的应用程序(自从它以前很快就开始工作时也没有改变).
有什么想法可能导致新的xampp安装中的这个大幅放缓?在httpd.conf,php.ini或my.ini中有什么东西我可能已经安装了新安装,现在可能导致数据库访问速度慢吗?
谢谢!
我正在网站上工作,允许人们在线创建个人资料.我想知道使用MySQL AUTO_INCREMENT
ed ID作为我的用户ID 是否是正确的选择.还要记住,有一天我可能不得不跨多个服务器复制数据库?
例如,你会在Twitter或Facebook这样的网站上对userIds使用这种方法吗?
我之前尝试用PHP生成userIds.我使用过这样的东西:
function generateID() {
$possible = "1234567890";
$code = "";
$characters = mt_rand(7,14);
$i = 0;
while ($i < $characters) {
$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
$i++;
}
return $code;
}
Run Code Online (Sandbox Code Playgroud)
这给出了我需要的值类型,但是我总是必须从DB检查该ID是否还不存在.
有没有更好的方法?
当基础表在MySQL中更新而不查询时,视图是否会自动更新?
进一步详细说明 - 如果我更新表,那么即使我没有在视图上运行任何查询,视图也会更新?