小编Der*_*sed的帖子

在MySQL中循环结果集

我试图在MySQL中编写一个存储过程,它将执行一个稍微简单的选择查询,然后循环结果,以决定是执行其他查询,数据转换还是完全丢弃数据.实际上,我想实现这个:

$result = mysql_query("SELECT something FROM somewhere WHERE some stuff");
while ($row = mysql_fetch_assoc($result)) {
    // check values of certain fields, decide to perform more queries, or not
    // tack it all into the returning result set
}
Run Code Online (Sandbox Code Playgroud)

只是,我只想在MySQL中使用它,因此可以将其称为过程.我知道对于触发器,有FOR EACH ROW ...语法,但我无法在CREATE TRIGGER ...语法之外找到类似这样的东西.我已经阅读了MySQL中的一些循环机制,但到目前为止我可以想象的是,我将实现类似这样的东西:

SET @S = 1;
LOOP
    SELECT * FROM somewhere WHERE some_conditions LIMIT @S, 1
    -- IF NO RESULTS THEN
    LEAVE
    -- DO SOMETHING
    SET @S = @S + 1;
END LOOP
Run Code Online (Sandbox Code Playgroud)

虽然在我看来这甚至有些朦胧. …

mysql loops stored-procedures cursor

59
推荐指数
2
解决办法
14万
查看次数

为什么crypt/blowfish使用两种不同的盐生成相同的哈希?

这个问题与PHP的实现有关crypt().对于这个问题,盐的前7个字符不计算,所以盐' $2a$07$a'的长度为1,因为它只有盐的1个字符和元数据的7个字符.

当使用长度超过22个字符的salt字符串时,生成的哈希值没有变化(即截断),当使用短于21个字符的字符串时,盐将自动填充($显然有' '字符); 这是相当简单的.但是,如果给出20个字符的盐和21个字符的盐,除了21个长度的盐的最终字符外两个是相同的,两个散列字符串都是相同的.一个长22个字符的盐,除了最后一个字符外,它与21个长度的盐相同,哈希值会再次不同.

代码示例:

$foo = 'bar';
$salt_xx = '$2a$07$';
$salt_19 = $salt_xx . 'b1b2ee48991281a439d';
$salt_20 = $salt_19 . 'a';
$salt_21 = $salt_20 . '2';
$salt_22 = $salt_21 . 'b';

var_dump(
    crypt($foo, $salt_19), 
    crypt($foo, $salt_20), 
    crypt($foo, $salt_21), 
    crypt($foo, $salt_22)
);
Run Code Online (Sandbox Code Playgroud)

会产生:

string(60) "$2a$07$b1b2ee48991281a439d$$.dEUdhUoQXVqUieLTCp0cFVolhFcbuNi"
string(60) "$2a$07$b1b2ee48991281a439da$.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2O4AH0.y/AsOuzMpI.f4sBs8E2hQjPUQq"
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

编辑:

一些用户注意到整个字符串存在差异,这是正确的.在salt_20,偏移(28,4)是da$.,而在salt_21,偏移(28,4)是da2.; 但是,重要的是要注意生成的字符串包括散列,盐,以及生成盐的指令(即$2a$07$); 实际上,差异发生的部分仍然是盐.实际哈希值不变UxGYN739wLkV5PGoR1XA4EvNVPjwylG.

因此,这实际上并不是产生的散列的差异,而是用于存储散列的盐的差异,这恰恰是手头的问题:两个盐生成相同的散列.

Rembmer:输出将采用以下格式:

"$2a$##$saltsaltsaltsaltsaltsaHASHhashHASHhashHASHhashHASHhash"
//                            ^ Hash Starts …
Run Code Online (Sandbox Code Playgroud)

php hash crypt blowfish salt

30
推荐指数
2
解决办法
1万
查看次数

使用PHP的crypt的河豚盐的正确格式是什么?

我已经阅读了PHP手册输入中crypt()提供的信息,但我发现自己仍然不确定触发Blowfish算法的salt的格式.

根据手动输入,我应该使用'$ 2 $'或'$ 2a $'作为16个字符串的开头.然而,在以后的例子中,他们使用更长的字符串:" $2a$07$usesomesillystringforsalt$",这表明,我认为任何字符串我提供将切片和切块以适应模型.

我遇到的问题实际上是触发河豚算法中VS STD_DES.例:

$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt); 
// $hash = $26HdMTpoODt6
Run Code Online (Sandbox Code Playgroud)

那哈希显然不是漩涡,事实上STD_DES只有盐的前两个字符用于盐.但是,在PHP手册的例子中,他们的盐以' $2a$07$' 开头,所以如果我将这三个字符添加到相同的代码中,我得到以下内容:

$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt); 
// $hash = $2a$07$b1b2ee48991281a439da2OHi1vZF8Z2zIA.8njYZKR.9iBehxLoIC
Run Code Online (Sandbox Code Playgroud)

我发现我可以提供在此处显示为"人物存在一些差异07$",例如04$15$两个工作,但01$通过03$不工作(生成一个空字符串),和值等99$,并85$ …

php hash crypt blowfish salt

15
推荐指数
1
解决办法
8627
查看次数

如何使用css选择剩余宽度的一半?

我想要有三列,一个1000px的中间列,以页面为中心,然后左右一列占据剩余的宽度.

我基本上想要一些看起来像这样的东西:

说明

包装器为1000px,两个侧面空间为剩余总空间的一半.

html css

8
推荐指数
1
解决办法
4924
查看次数

是否有用于表示来自不同表的多个对象的规范化形式?

对于我当前正在构建的系统,会出现以下两种情况:

  1. 我的权限系统是将角色和角色的权限附加到用户的常年最爱,但有一个转折:权限可以应用于任何层的任何资产,并且有4个"层",编号为0到3.因此,角色分配表长度为5个字段:资产层,资产ID,角色ID,用户ID和"已禁用"标志.该"Tier/ID"系统还用于将用户分配给"Home Asset".

    这个系统的不幸副作用是,在应用程序本身中解析我的这些资产引用通常要简单得多,而不是在SQL中(我知道它可以这样做,但它会导致一些严重的丑陋查询) . 有没有更好的方式来表示这种关系?这是表达这种关系的可接受方式吗?

    旁注:资产本身的表(它们是分层的)是规范化的,外键引用从子节点指向父节点(例如,第3层包含有关第2层的信息等),因此一旦单个资产被固定,它就非常很容易找到它的孩子和祖先.

  2. 类似的问题,但不同的数据上下文:在最低层,设备可以"附加".还允许将设备放置在图形表示(如地图)上,并将它们的排列信息存储在数据库中.图形引用(也称为"点")应指向真实设备,但实际设备可能不指向图形引用.

    目前,所有"点"(代表设备)都有一个参考表,其中包含显示布局,位置,大小等信息.我可以从这里确定三个可能的事情:

    1. 创建一系列规范化表来表示各个设备,并使用类似的"设备类型/设备ID"系统查找它们,并将此信息存储在"点"表中; 这仍然需要应用程序在解析对各自表中的实际设备的引用时进行中间工作
    2. 创建一系列规范化表,并将它们指向"点"表; 此解决方案可能不需要应用程序取消引用点数据,但需要扫描所有设备表以查找任何第3层对象.
    3. 使用点表作为指导,将所有相关显示数据添加到每个相应的标准化表中.虽然这可以防止必须完全解决任何查找,但仍然需要扫描每个设备表,并且与其他解决方案相比,对于必须存储点数据的方式的任何变化也非常不容忍.

    这个问题已经解决了,我只是没有得到备忘录?是否有解决此问题的标准设计,或者我应该假设我必须自己解决这些引用?

注意:关于问题二,我认为以下两种解决方案是可怕的,我不会考虑它们(除非有一些疯狂的,令人惊讶的证据表明它是最好的方式,我很确定它不是):

  1. 在点表本身中存储有关每个设备的所有信息(在序列化数组或某些此类机制中).这具有明显的问题,即完全无法搜索并且违反正常形式
  2. 将所有设备存储在单个通用表中.不幸的是,这些设备在它们提供的数据类型以及它们必须如何被访问方面都有很大的不同,并且在一个表格中这样做需要,上次我尝试在纸上完成它,至少30(并且可能更多)列,其中一半以上的每行都为空.

请求和赞赏任何解决方案,但我特别寻找解决此问题的现有模式和/或规范化模式(如果存在).如果您知道这是正确答案的事实,"否"就足够了,我将继续使用应用程序层来解析这些引用.它还没有成为问题,我只是想知道当有人已经解决了这个/这些问题时,我并没有在错误的方向上开辟道路.提前致谢.

编辑:权限/资产架构

第0层实际上是隐含的,而不是在数据库中,但有些东西被注册为第0层(资产ID 0)

第1层:

id int(5) unsigned not null primary key auto_increment,
name varchar(32) not null,
disabled tinyint(1) unsigned not null,
Run Code Online (Sandbox Code Playgroud)

2级:

id int(5) unsigned not null primary key auto_increment,
parentId int(5) unsigned not null,
name varchar(32) not null,
abbr varchar(16) not null,
disabled tinyint(1) unsigned not null,
foreign key (parentId) references tier1(id)
Run Code Online (Sandbox Code Playgroud)

第3层:

id int(5) unsigned not null …
Run Code Online (Sandbox Code Playgroud)

php mysql architecture design-patterns normalization

5
推荐指数
1
解决办法
180
查看次数

如何通过C#重现"在文件夹中显示"/"查找目标"

使用Chrome时,如果您下载文件,则可以选择一个选项(在文件夹中显示),该选项将打开包含目录并突出显示该文件.同样,如果您查看快捷方式的属性,则可以为相同的功能选择"查找目标"按钮.我已经尝试了大量的搜索,以及查看Shell函数的MSDN条目的相当部分,但无济于事.我认为它只是一个简单的API调用或其系列,但我找不到它.

c# windows windows-shell

4
推荐指数
1
解决办法
1525
查看次数

为什么我的c#paint方法内存不足?

我是c#的新手,并试图通过编写一些简单的应用来学习语法和.NET库.我最近的一个小型项目是一个像这里发现的极地时钟.

我之前注意到的一个问题是应用程序会不断地"闪烁",这实际上已经从演示文稿中消失了,所以我在网上阅读了如何实现双缓冲区,这消除了这个问题,但可能有也可能没有处理问题.这是我的onPaint方法; 通过定时器控制每33ms(~30 FPS)调用一次.该应用程序的其余部分大多数只是用于拖动应用程序的处理程序(因为它是无框架且具有透明背景),双击时退出等.

    protected override void OnPaint(PaintEventArgs e) {
        DateTime now = DateTime.Now;

        float secondAngle = now.Second / 60F;
        secondAngle += (now.Millisecond / 1000F) * (1F / 60F);

        float minuteAngle = now.Minute / 60F;
        minuteAngle += secondAngle / 60F;

        float hourAngle = now.Hour / 24F;
        hourAngle += minuteAngle / 60F;

        float dayOfYearAngle = now.DayOfYear / (365F + (now.Year % 4 == 0 ? 1F : 0F));
        dayOfYearAngle += hourAngle / 24F;

        float dayOfWeekAngle = (float)(now.DayOfWeek …
Run Code Online (Sandbox Code Playgroud)

c# gdi+ paint out-of-memory onpaint

4
推荐指数
2
解决办法
4870
查看次数

如何在c#中将一个文件集合与另一个文件集合进行比较?

我只是在学习C#(现在已经习惯了2天了)我已经决定,为了学习目的,我将重建一个我用VB6制作的旧应用程序来同步文件(通常是通过网络).

当我在VB 6中编写代码时,它的工作方式大致如下:

  1. 创建一个 Scripting.FileSystemObject
  2. 为源和目标创建目录对象
  3. 为源和目标创建文件列表对象
  4. 遍历源对象,并检查它是否存在于目标中
    • 如果没有,创建它
    • 如果是,请检查源版本是否更新/更大,如果是,则覆盖另一个

到目前为止,这就是我所拥有的:

private bool syncFiles(string sourcePath, string destPath) {
    DirectoryInfo source = new DirectoryInfo(sourcePath);
    DirectoryInfo dest = new DirectoryInfo(destPath);

    if (!source.Exists) {
        LogLine("Source Folder Not Found!");
        return false;
    }

    if (!dest.Exists) {
        LogLine("Destination Folder Not Found!");
        return false;
    }

    FileInfo[] sourceFiles = source.GetFiles();
    FileInfo[] destFiles = dest.GetFiles();

    foreach (FileInfo file in sourceFiles) {
        // check exists on file
    }

    if (optRecursive.Checked) {
        foreach (DirectoryInfo subDir in source.GetDirectories()) {
            // create-if-not-exists destination …
Run Code Online (Sandbox Code Playgroud)

c# directoryinfo fileinfo

0
推荐指数
1
解决办法
1989
查看次数