<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.5">Jekyll</generator><link href="https://blog.sgok.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.sgok.dev/" rel="alternate" type="text/html" /><updated>2024-06-10T16:26:35+00:00</updated><id>https://blog.sgok.dev/feed.xml</id><title type="html">blog.sgok.dev</title><subtitle>personal blog</subtitle><entry><title type="html">Kata Valid Braces Solution for PHP</title><link href="https://blog.sgok.dev/php/2022/03/11/kata-valid-braces-solution-for-php.html" rel="alternate" type="text/html" title="Kata Valid Braces Solution for PHP" /><published>2022-03-11T16:49:15+00:00</published><updated>2022-03-11T16:49:15+00:00</updated><id>https://blog.sgok.dev/php/2022/03/11/kata-valid-braces-solution-for-php</id><content type="html" xml:base="https://blog.sgok.dev/php/2022/03/11/kata-valid-braces-solution-for-php.html"><![CDATA[<p>Kata problem: Write a function that takes a string of braces, and determines if the order of the braces is valid. It should return true if the string is valid, and false if it’s invalid.</p>

<p>This Kata is similar to the Valid Parentheses Kata, but introduces new characters: brackets [], and curly braces {}. Thanks to @arnedag for the idea!</p>

<p>All input strings will be nonempty, and will only consist of parentheses, brackets and curly braces: ()[]{}.
<!--more--></p>

<h3 id="task">Task</h3>

<p>Write a function that takes a string of braces, and determines if the order of the braces is valid. It should return true if the string is valid, and false if it’s invalid.</p>

<p>This Kata is similar to the Valid Parentheses Kata, but introduces new characters: brackets [], and curly braces {}. Thanks to @arnedag for the idea!</p>

<p>All input strings will be nonempty, and will only consist of parentheses, brackets and curly braces: ()[]{}.</p>

<h5 id="what-is-considered-valid">What is considered Valid?</h5>
<p>A string of braces is considered valid if all braces are matched with the correct brace.</p>

<h4 id="examples">Examples</h4>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"(){}[]"   =&gt;  True
"([{}])"   =&gt;  True
"(}"       =&gt;  False
"[(])"     =&gt;  False
"[({})](]" =&gt;  False
</code></pre></div></div>
<h3 id="my-solution">My Solution</h3>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="n">validBraces</span><span class="p">(</span><span class="nv">$braces</span><span class="p">){</span>
    <span class="nv">$t</span> <span class="o">=</span> <span class="p">[];</span>
    <span class="k">for</span><span class="p">(</span><span class="nv">$i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nv">$i</span> <span class="o">&lt;</span> <span class="nb">strlen</span><span class="p">(</span><span class="nv">$braces</span><span class="p">);</span> <span class="nv">$i</span><span class="o">++</span><span class="p">){</span>
        <span class="k">if</span> <span class="p">(</span> <span class="nv">$braces</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"("</span> <span class="o">||</span> <span class="nv">$braces</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"{"</span> <span class="o">||</span> <span class="nv">$braces</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"["</span><span class="p">){</span>
          <span class="nb">array_push</span><span class="p">(</span><span class="nv">$t</span><span class="p">,</span> <span class="nv">$braces</span><span class="p">[</span><span class="nv">$i</span><span class="p">]);</span>
        <span class="p">}</span> <span class="k">else</span><span class="p">{</span>
          <span class="k">if</span><span class="p">(</span><span class="nb">count</span><span class="p">(</span><span class="nv">$t</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span> 
              <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
          <span class="p">}</span><span class="k">else</span><span class="p">{</span>
              <span class="nv">$lastValue</span> <span class="o">=</span> <span class="p">(</span><span class="nb">count</span><span class="p">(</span><span class="nv">$t</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
              <span class="k">if</span><span class="p">(</span> <span class="p">(</span><span class="nv">$braces</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span> <span class="o">==</span> <span class="s1">']'</span> <span class="o">&amp;&amp;</span> <span class="nv">$t</span><span class="p">[</span><span class="nv">$lastValue</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'['</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="nv">$braces</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'}'</span> <span class="o">&amp;&amp;</span> <span class="nv">$t</span><span class="p">[</span><span class="nv">$lastValue</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'{'</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="nv">$braces</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span> <span class="o">==</span> <span class="s1">')'</span> <span class="o">&amp;&amp;</span> <span class="nv">$t</span><span class="p">[</span><span class="nv">$lastValue</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'('</span><span class="p">))</span>
              <span class="p">{</span>
                <span class="nb">array_pop</span><span class="p">(</span><span class="nv">$t</span><span class="p">);</span>
              <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="k">break</span><span class="p">;</span>
              <span class="p">}</span>
          <span class="p">}</span>
          
        <span class="p">}</span>
    <span class="p">}</span>
  
  <span class="k">if</span><span class="p">(</span><span class="nb">count</span><span class="p">(</span><span class="nv">$t</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span>
      <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
  <span class="p">}</span><span class="k">else</span><span class="p">{</span>
      <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
  <span class="p">}</span>
    
<span class="p">}</span>
</code></pre></div></div>

<h3 id="clever-solution">Clever Solution</h3>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="n">validBraces</span><span class="p">(</span><span class="nv">$braces</span><span class="p">){</span>
    <span class="k">do</span><span class="p">{</span>
        <span class="nv">$braces</span> <span class="o">=</span> <span class="nb">str_replace</span><span class="p">([</span><span class="s1">'()'</span><span class="p">,</span> <span class="s1">'[]'</span><span class="p">,</span> <span class="s1">'{}'</span><span class="p">],</span> <span class="s1">''</span><span class="p">,</span> <span class="nv">$braces</span><span class="p">,</span> <span class="nv">$count</span><span class="p">);</span>
    <span class="p">}</span><span class="k">while</span><span class="p">(</span><span class="nv">$count</span><span class="p">);</span>
    
    <span class="k">return</span> <span class="k">empty</span><span class="p">(</span><span class="nv">$braces</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p><a href="https://www.codewars.com/users/SergeyLevchuk">Solver’s Profile</a></p>

<p>Best practices and clever solution for valid braces problem.</p>

<h3 id="cheating-solution-very-very-clever-">Cheating Solution (Very very clever :))</h3>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="n">validBraces</span><span class="p">(</span><span class="kt">string</span> <span class="nv">$braces</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// Cheating :)</span>
    <span class="nv">$doc</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">DOMDocument</span><span class="p">();</span>
    <span class="k">try</span> <span class="p">{</span>
        <span class="nv">$doc</span><span class="o">-&gt;</span><span class="nf">loadXML</span><span class="p">(</span>
            <span class="s1">'&lt;root&gt;'</span> <span class="mf">.</span> <span class="nb">str_replace</span><span class="p">(</span>
                <span class="p">[</span><span class="s1">'{'</span><span class="p">,</span> <span class="s1">'}'</span><span class="p">,</span> <span class="s1">'['</span><span class="p">,</span> <span class="s1">']'</span><span class="p">,</span> <span class="s1">'('</span><span class="p">,</span> <span class="s1">')'</span><span class="p">],</span> 
                <span class="p">[</span><span class="s1">'&lt;a&gt;'</span><span class="p">,</span> <span class="s1">'&lt;/a&gt;'</span><span class="p">,</span> <span class="s1">'&lt;b&gt;'</span><span class="p">,</span> <span class="s1">'&lt;/b&gt;'</span><span class="p">,</span> <span class="s1">'&lt;i&gt;'</span><span class="p">,</span> <span class="s1">'&lt;/i&gt;'</span><span class="p">],</span> 
                <span class="nv">$braces</span>
            <span class="p">)</span> <span class="mf">.</span> <span class="s1">'&lt;/root&gt;'</span><span class="p">);</span>
            
        <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nc">Exception</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><a href="https://www.codewars.com/users/asedov">Solver’s Profile</a></p>]]></content><author><name></name></author><category term="php" /><summary type="html"><![CDATA[Kata problem: Write a function that takes a string of braces, and determines if the order of the braces is valid. It should return true if the string is valid, and false if it’s invalid. This Kata is similar to the Valid Parentheses Kata, but introduces new characters: brackets [], and curly braces {}. Thanks to @arnedag for the idea! All input strings will be nonempty, and will only consist of parentheses, brackets and curly braces: ()[]{}.]]></summary></entry><entry><title type="html">Kata Sort the Odd Solution for PHP</title><link href="https://blog.sgok.dev/php/2022/03/08/kata-sort-the-odd-solution-for-php.html" rel="alternate" type="text/html" title="Kata Sort the Odd Solution for PHP" /><published>2022-03-08T15:10:15+00:00</published><updated>2022-03-08T15:10:15+00:00</updated><id>https://blog.sgok.dev/php/2022/03/08/kata-sort-the-odd-solution-for-php</id><content type="html" xml:base="https://blog.sgok.dev/php/2022/03/08/kata-sort-the-odd-solution-for-php.html"><![CDATA[<p>Kata problem: You will be given an array of numbers. You have to sort the odd numbers in ascending order while leaving the even numbers at their original positions.
<!--more--></p>

<h3 id="task">Task</h3>

<p>You will be given an array of numbers. You have to sort the odd numbers in ascending order while leaving the even numbers at their original positions.</p>

<h4 id="examples">Examples</h4>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[7, 1]  =&gt;  [1, 7]
[5, 8, 6, 3, 4]  =&gt;  [3, 8, 6, 5, 4]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]  =&gt;  [1, 8, 3, 6, 5, 4, 7, 2, 9, 0]
</code></pre></div></div>
<h3 id="my-solution-too-long-and-impractical">My Solution (too long and impractical)</h3>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="n">sortArray</span><span class="p">(</span><span class="kt">array</span> <span class="nv">$arr</span><span class="p">)</span> <span class="p">:</span> <span class="kt">array</span> <span class="p">{</span>
    <span class="nv">$oArr</span> <span class="o">=</span> <span class="p">[];</span>
    <span class="nv">$eArr</span> <span class="o">=</span> <span class="p">[];</span>
    <span class="nv">$newArray</span> <span class="o">=</span> <span class="p">[];</span>
    <span class="k">foreach</span><span class="p">(</span><span class="nv">$arr</span> <span class="k">as</span> <span class="nv">$array</span><span class="p">){</span>
        <span class="k">if</span><span class="p">((</span><span class="nv">$array</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
           <span class="nb">array_push</span><span class="p">(</span><span class="nv">$oArr</span><span class="p">,</span> <span class="nv">$array</span><span class="p">);</span>
        <span class="p">}</span><span class="k">else</span> <span class="k">if</span><span class="p">((</span><span class="nv">$array</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span>
            <span class="nb">array_push</span><span class="p">(</span><span class="nv">$eArr</span><span class="p">,</span> <span class="nv">$array</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="nb">sort</span><span class="p">(</span><span class="nv">$oArr</span><span class="p">);</span>
    <span class="k">for</span> <span class="p">(</span><span class="nv">$i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nv">$i</span> <span class="o">&lt;</span> <span class="nb">count</span><span class="p">(</span><span class="nv">$arr</span><span class="p">);</span> <span class="nv">$i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="nv">$arr</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span><span class="o">%</span><span class="mi">2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
          <span class="nb">array_push</span><span class="p">(</span><span class="nv">$newArray</span><span class="p">,</span> <span class="nb">array_shift</span><span class="p">(</span><span class="nv">$eArr</span><span class="p">));</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
          <span class="nb">array_push</span><span class="p">(</span><span class="nv">$newArray</span><span class="p">,</span> <span class="nb">array_shift</span><span class="p">(</span><span class="nv">$oArr</span><span class="p">));</span>
        <span class="p">}</span>
    <span class="p">}</span>
    
    <span class="k">return</span> <span class="nv">$newArray</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>I’m not suggesting you my own solution because I chose to solve it the long way.</p>

<h3 id="best-practices-solution">Best Practices Solution</h3>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="n">sortArray</span><span class="p">(</span><span class="kt">array</span> <span class="nv">$arr</span><span class="p">)</span> <span class="p">:</span> <span class="kt">array</span> <span class="p">{</span>
  <span class="nv">$odds</span> <span class="o">=</span> <span class="nb">array_filter</span><span class="p">(</span><span class="nv">$arr</span><span class="p">,</span> <span class="k">function</span> <span class="p">(</span><span class="nv">$n</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nv">$n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">;</span> <span class="p">});</span>
  <span class="nb">sort</span><span class="p">(</span><span class="nv">$odds</span><span class="p">);</span>
  <span class="k">return</span> <span class="nb">array_map</span><span class="p">(</span><span class="k">function</span> <span class="p">(</span><span class="nv">$n</span><span class="p">)</span> <span class="k">use</span> <span class="p">(</span><span class="o">&amp;</span><span class="nv">$odds</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="nv">$n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="nv">$n</span><span class="p">;</span>
    <span class="k">return</span> <span class="nb">array_shift</span><span class="p">(</span><span class="nv">$odds</span><span class="p">);</span>
  <span class="p">},</span> <span class="nv">$arr</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p><a href="https://www.codewars.com/users/dfhwz">Solver’s Profile</a></p>

<p>Best practices and clever solution for sort the odd.</p>]]></content><author><name></name></author><category term="php" /><summary type="html"><![CDATA[Kata problem: You will be given an array of numbers. You have to sort the odd numbers in ascending order while leaving the even numbers at their original positions.]]></summary></entry><entry><title type="html">Android APK Dosyalarını Decompile Etmek</title><link href="https://blog.sgok.dev/android/2017/02/16/android-apk-dosyalarini-decompile-etmek.html" rel="alternate" type="text/html" title="Android APK Dosyalarını Decompile Etmek" /><published>2017-02-16T15:17:43+00:00</published><updated>2017-02-16T15:17:43+00:00</updated><id>https://blog.sgok.dev/android/2017/02/16/android-apk-dosyalarini-decompile-etmek</id><content type="html" xml:base="https://blog.sgok.dev/android/2017/02/16/android-apk-dosyalarini-decompile-etmek.html"><![CDATA[<p>APK dosyalarını gerek zararlı yazılım tespiti gerekse belli başlı özellikleri irdelemek amaçlı <strong>decompile</strong> etme ihtiyacı duyabiliriz. Şimdi bu iş nasıl yapılır konuya girelim.
<!--more--></p>

<h4 id="başlayalım"><strong>Başlayalım;</strong></h4>

<ol>
  <li>
    <p>Öncelikle <strong>APK</strong> dosyamızı indiriyoruz, sonrasında uzantısını .apk’dan .zip’e çeviriyoruz. (Eğer APK dosyası yoksa sadece Google Play üzerinde yüklü ise <strong><a href="https://apk-dl.com">bu siteye</a></strong> girip programın adını yazarak aratıyoruz ve arama sonucunda göründüyse tıklayıp <strong>Download</strong> seçeneğine tıklıyoruz.)</p>
  </li>
  <li>
    <p>Daha sonra herhangi bir arşiv programıyla(Windows için: winrar, winzip vs. Linux için: <code class="language-plaintext highlighter-rouge">unzip dosyaadi.zip</code>) .zip uzantılı yaptığımız dosyayı extract ediyoruz.</p>
  </li>
  <li>
    <p>Buraya kadar her şey tamamsa şimdi  <strong><a href="https://sourceforge.net/projects/dex2jar/">dex2jar</a> </strong>programını indiriyoruz ve zip dosyasını extract ediyoruz.</p>
  </li>
  <li>
    <p>Az önce apk dosyasını açtığımız klasöre girip classes.dex dosyasını dex2jar klasörünün içine kopyalıyoruz.</p>
  </li>
  <li>
    <p>Şimdi Windows için:<strong>CMD</strong>‘yi açıp şu komutu veriyoruz <code class="language-plaintext highlighter-rouge">cd dex2jar_klasor_yolu</code> . Linux için: Terminali açıp <code class="language-plaintext highlighter-rouge">cd dex2jar_klasor_yolu</code> aynı komutu veriyoruz.</p>
  </li>
  <li>
    <p>Yukarıda ki komut ile dex2jar klasorune geldiyseniz şimdi (JAVA kütüphanelerinin bilgisayarınızda yüklü olduğunu varsayıyorum, eğer yüklü değilse öncelikle JAVA SDK’larını yükleyin.) Windows için: <code class="language-plaintext highlighter-rouge">d2j-dex2jar.bat classes.dex</code> Linux için: <code class="language-plaintext highlighter-rouge">chmod u+x d2j-dex2jar.sh</code>  ardından <code class="language-plaintext highlighter-rouge">./d2j-dex2jar.sh classes.dex</code> sonra komutunu verdikten sonra dosyayı .jar uzantısına çevirmesini bekliyoruz.</p>
  </li>
  <li>
    <p><strong><a href="http://jd.benow.ca/">jdgui</a></strong> programını indiriyoruz ve programı açıyoruz sonra programda <strong>File</strong> sekmesinden <strong>Open File</strong> diyerek <u>classes-dex2jar.jar</u> (veya sizin bilgisayarınızda adı her ne olduysa) dosyasını seçiyoruz ve karşınızda artık decompile edilmiş source dosyaları var. (Bu program java ile yazıldığı için cross platform çalışma özelliğine sahip yani Windows’da da Linux’da da aynı şekilde açabilirsiniz.)</p>
  </li>
  <li>
    <p>jdgui programından yine File sekmesine tıklayıp <strong>Save All Sources </strong>diyerek dosyaları bir yere kaydediyoruz ve artık herhangi bir kod düzenleyici editör yardımıyla dosyalarımızın içeriğinde ne arıyorsak bakmaya başlıyoruz.</p>
  </li>
</ol>

<p>İşte herşey bu kadar artık hangi amaçla kullanmak istiyorsanız decompile edilmiş kodları kullanabilirsiniz.</p>]]></content><author><name></name></author><category term="android" /><summary type="html"><![CDATA[APK dosyalarını gerek zararlı yazılım tespiti gerekse belli başlı özellikleri irdelemek amaçlı decompile etme ihtiyacı duyabiliriz. Şimdi bu iş nasıl yapılır konuya girelim.]]></summary></entry><entry><title type="html">Memcached Kurulumu ve Kullanımı</title><link href="https://blog.sgok.dev/server/2016/06/01/memcached-kurulumu-ve-kullanimi.html" rel="alternate" type="text/html" title="Memcached Kurulumu ve Kullanımı" /><published>2016-06-01T13:03:00+00:00</published><updated>2016-06-01T13:03:00+00:00</updated><id>https://blog.sgok.dev/server/2016/06/01/memcached-kurulumu-ve-kullanimi</id><content type="html" xml:base="https://blog.sgok.dev/server/2016/06/01/memcached-kurulumu-ve-kullanimi.html"><![CDATA[<p>Merhaba arkadaşlar, bir önceki yazımda site performansını arttırma ile alakalı bir yazı yazacağımı söylemiştim. Bunun tek bir yazıya sığmayacağını düşündüm ve bir performans serisi yapmaya karar verdim. Bu serinin ilk ayağı olan bu yazımda cachleme sistemlerinden <code class="language-plaintext highlighter-rouge">Memcached</code>‘ı anlatmaya çalışacağım.
<!--more-->
Bilindiği üzere cachleme denilince genellikle <em>shared hosting</em> sahibi olanların çözüm olarak kullandığı <em>html output</em> yöntemi akla gelir. Bu yöntemde sayfa içindeki ögeler bir cache klasörüne html çıktısı olarak kaydedilir ve siteye giren kullanıcılara bu html çıktısı gösterilir. Zaten paylaşımlı hosting kullananların hemen hemen başka çaresi de yoktur. <strong>Smarty</strong> gibi template engine sistemi kullananlar bu <code class="language-plaintext highlighter-rouge">template engine</code>lerin kendi içinde bulunan cachleme yöntemlerinden faydalanırlar. Bu tarz bir sistem kullanmayanlar ise kendi yöntemlerini geliştirerek bir şekilde cachleme sistemi yaparlar.</p>

<p>Bugün anlatacağım konu ise <em>VPS - VDS - Dedicated Server</em> kullananların işine yarayacak bir konu, shared hosting kullananlar için kendi cachleme yöntemlerini yapabilecekleri bir sistemi başka bir yazımda konu edeceğim.</p>

<p>Konuyu daha fazla dağıtmadan biraz <strong>Memcached</strong>‘dan bahsedeyim.</p>

<h3 id="memcached-nedir">Memcached Nedir?</h3>

<p>Memcached dünyaca ünlü <strong>LiveJournal</strong> sitesi için geliştirilmiş açık kaynak kodlarından oluşan bir önbellekleme sistemidir. Facebook yazılım mühendislerinin geliştirmekte olduğu bu sistemi şuan dünyaca ünlü bir çok web sitesi_(Wikipedia, Facebook, Flickr, Twitter gibi)_ kullanmaktadır. Temel amacı yüksek trafik alan web sitelerinin sunucu yükünü azaltarak hızlı ve performanslı bir kullanıcı deneyimi sunmaktır.</p>

<h3 id="çalışma-prensibi">Çalışma Prensibi</h3>

<p>Memcached’in çalışma mantığı aslında çok basit bir yapıdan ibarettir. Veritabanından çekilen veriyi ya da herhangi bir veriyi <strong>Key</strong> ve <strong>Value</strong> ile RAM belleğe atarak buradan ulaşılmasını sağlamaktır. RAM belleklerin okuma ve yazma hızını bilmeyeniniz yoktur sanırım. Tabi ki bu da hız ve performansı çok olumlu bir yönde etkilemektedir. Eğer yeteri kadar RAM belleğiniz varsa kesinlikle yüksek trafik alan web siteleriniz için Memcached kullanmanızı öneririm.</p>

<p>Bu sistem TCP/IP alt yapısını kullanarak bir çok farklı platformdan erişilebilmeyi de sağlar. Sadece PHP olarak düşünmemek gerekir bir çok yazılım platformunun birlikte kullanımlarında ideal bir çözümdür. Örneğin <em>Session paylaşımı</em> yaparkende memcached kesinlikle iyi bir araçtır.</p>

<h3 id="kurulum-ve-yapılandırılması">Kurulum ve Yapılandırılması</h3>

<p><strong>Ubuntu 14.04 Üzerinde Kurulumu</strong></p>

<p>Öncelikle sistemi update ediyoruz ve sonra gerekli olan paketleri kuruyoruz.<em>(Sisteminizde Apache, MySQL Server ve PHP kurulu olduğu varsayılarak anlatılmıştır.)</em> SSH üzerinden aşağıdaki komutları uygulayınız.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get update
sudo apt-get install php5-memcached memcached
</code></pre></div></div>

<p><strong>PECL ile Kurmak İçin</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pecl install memcache
</code></pre></div></div>

<p>Servisi başlatmak için.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>memcached -d -m 512 -l 127.0.0.1 -p 11211 -u nobody
</code></pre></div></div>

<p>Daha sonrasında Apache Servera bir restart atalım.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo service apache2 restart
</code></pre></div></div>

<p>Şimdi kurulduğunu görmek için public_html dizininizde bir php dosyası oluşturup içine aşağıdaki kodu yazınız.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;?php
phpinfo();
?&gt;
</code></pre></div></div>

<p>Böylece kurulu olup olmadığının kontrolünü yapınız. Eğer kurulduysa şöyle bir görüntüyle karşılacaksınız.</p>

<p><img src="/assets/img/upload/memcached_ubuntu_phpinfos.png" alt="Memcached" /></p>

<p>Şimdi sistemde aktif olup olmadığını anlamak için SSH üzerinde aşağıdaki komutu verelim.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ps aux | grep memcached
</code></pre></div></div>

<p>Komutunu verdiğinizde şöyle bir görüntüyle karşılaşmalısınız.</p>

<p><img src="/assets/img/upload/memcached_ubuntu_ps_auxs.png" alt="Memcached PS AUX" /></p>

<p>Buradan anlaşıldığı üzere memcached 11211 numaralı porttan çalışmaktadır.</p>

<p>Daha sonra memcached servisine bir restart atalım.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo service memcached restart
</code></pre></div></div>

<p>Artık elimizde hazır bir memcached servisi var. Kurulumu bu kadar kolay işte siz ne sanmıştınız? :)</p>

<p><strong>Centos Üzerinde Kurulumu</strong></p>

<p>Öncelikle gerekli olan bağımlılıkları kuralım.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum install libevent libevent-devel
</code></pre></div></div>

<p>Daha sonrasında /usr/local/src dizinine gidip gerekli olan memcached dosyasını indiriyoruz.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd /usr/local/src
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
</code></pre></div></div>

<p>Arşiv dosyasını extract ediyoruz ve açılan dizinin içine giriyoruz.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tar xvzf memcached-1.4.15.tar.gz
cd memcached-1.4.15
</code></pre></div></div>

<p>Şimdi sıra geldi programı derlemeye. <em>(Sunucunuzun 64 Bit olduğu varsayılmıştır.)</em> Ama öncesinde <strong>gcc</strong> ve <strong>make</strong> derleme araçlarının bulunduğundan emin olun eğer yoksa aşağıdaki komutları veriniz.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum install gcc
yum install make
</code></pre></div></div>

<p>Daha sonra ise derleme işlemini başlatalım.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./configure --enable-64bit
</code></pre></div></div>

<p>Eğer işlemciniz çoklu çekirdeğe sahipse(Multi-Core) Threading özelliğini aktif edebilirsiniz derleme esnasında.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./configure --enable-threads --enable-64bit
</code></pre></div></div>

<p>Komutlarını veriniz ve sonra yükleme işlemine geçelim.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make &amp;&amp; make install
</code></pre></div></div>

<p>Eğer bir hata almadıysanız muhtemelen memcached serverı yüklenmiştir. Şimdi serverı başlatmak için aşağıdaki komutları verelim.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>memcached -d -u nobody -m 512 -p 11211 127.0.0.1
</code></pre></div></div>

<p>Garanti olması açısından memcached serverına ve apache sunucusuna restart atmakta fayda var.</p>

<p><strong>Windows Üzerinde Xampp’a Kurulumu</strong></p>

<p>Öncelikle Xampp’ın kurulu olduğu dizine gidiyoruz ve php klasörüne giriyoruz. Sonrasında php.ini dosyasını açıp aşağıdaki kodu aratıyoruz.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>;extension=php_memcache.dll
</code></pre></div></div>

<p>Bulduysak eğer yanındaki noktalı virgülü kaldırıp modülün aktif olmasını sağlıyoruz. Eğer yoksa aşağıdaki kodları dosyanın en altına yapıştırıp kaydediyoruz.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>extension=php_memcache.dll
[Memcache]
memcache.allow_failover = 1
memcache.max_failover_attempts=20
memcache.chunk_size =8192
memcache.default_port = 11211
</code></pre></div></div>

<p>Daha sonra şu adresten <a href="http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/php_memcache-3.0.8-5.5-ts-vc11-x86.zip" title="Memcache Library for Windows">Windows Memcache DLL</a> zip dosyasını indiriyoruz. Zip dosyasını açıp içindeki “php_memecache.dll” dosyasını xampp\php\ext klasörünün içine atıyoruz. Sonrasında ise <a href="http://static.runoob.com/download/memcached-1.2.6-win32-bin.zip" title="Memcached Server for Windows">Memcached Server</a> dosyasını indiriyoruz ve c: üzerinde memcached klasörü oluşturup indirdiğimiz dosyanın içinden çıkan .exe dosyasını <code class="language-plaintext highlighter-rouge">c:\memcached</code> klasörünün içine atıyoruz.</p>

<p>Sonra <strong>CMD</strong> programını <strong>Yönetici olarak çalıştır</strong> diyerek açıyoruz ve şu komutu veriyoruz.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>c:/memcached/memcached.exe -d install
</code></pre></div></div>

<p>Sonrasında</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>net start "memcached server"
</code></pre></div></div>

<p>Komutunu vererek serverı çalıştırıyoruz.</p>

<p>Xampp’ı restart ediyoruz.</p>

<p>Memcached’i restart ediyoruz.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>C:\Windows\system32&gt; net start “memcached”

C:\Windows\system32&gt; net stop  “memcached”
</code></pre></div></div>

<p>Komutlarını sırasıyla vererek restart işlemini tamamlamış oluyoruz.</p>

<h3 id="memcache-kullanımı">Memcache Kullanımı</h3>

<p>Eğer hata almadıysanız hemen hemen popüler bir çok işletim sisteminde <strong>Memcached Serverı</strong> ve <strong>Memcache Library</strong> kurulumlarını tamamladık. Memcached ile Memcache arasındaki fark birisi serverın adı diğeri ise kütüphanenin adıdır, bu ayrıntıyı vererek konuya devam ediyorum.</p>

<p>Şimdi ufak bir test yapalım ve memcache çalışacak mı bakalım. public_html klasörümüzde bir php dosyası oluşturarak içine aşağıdaki kodları yazalım.</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="cp">&lt;?php</span>
    <span class="nv">$mem</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Memcache</span><span class="p">;</span>
    <span class="nv">$mem</span><span class="o">-&gt;</span><span class="nf">connect</span><span class="p">(</span><span class="s1">'localhost'</span><span class="p">,</span> <span class="mi">11211</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span> <span class="p">(</span><span class="s2">"Bağlantı Hatası!"</span><span class="p">);</span>

    <span class="nv">$version</span> <span class="o">=</span> <span class="nv">$mem</span><span class="o">-&gt;</span><span class="nf">getVersion</span><span class="p">();</span>
    <span class="k">echo</span> <span class="s2">"Server's version: "</span><span class="mf">.</span><span class="nv">$version</span><span class="mf">.</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>

    <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$mem</span><span class="o">-&gt;</span><span class="nf">get</span><span class="p">(</span><span class="s2">"data"</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="nv">$result</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">echo</span> <span class="nv">$result</span><span class="p">;</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="k">echo</span> <span class="s2">"Cachelenmiş data bulunamadı ama sayfayı yenilerseniz cachlenecek!"</span><span class="p">;</span>
        <span class="nv">$mem</span><span class="o">-&gt;</span><span class="nf">set</span><span class="p">(</span><span class="s2">"data"</span><span class="p">,</span> <span class="s2">"Ben datayım! Benim içeriğim burada yer alıyor."</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s2">"Memcached bir hatadan dolayı veriyi kaydedemedi!"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="cp">?&gt;</span>
</code></pre></div></div>
<p>Yukarıdaki kodları “cache.php” diye kaydedip browserınızda çalıştırdığınızda ilk olarak karşınıza</p>

<blockquote>
  <p>Cachelenmiş data bulunamadı ama sayfayı yenilerseniz cachlenecek!</p>
</blockquote>

<p>uyarısı çıkacak ve sayfayı yenilediğinizde ise</p>

<blockquote>
  <p>Ben datayım! Benim içeriğim burada yer alıyor.</p>
</blockquote>

<p>yazacak böylece artık ilk cachlememizi yapmış olacağız.</p>

<p>Yukarıda bulunan örnekte çok basit bir yapıyla gösterdim tabi ki şimdi daha detaylı bir örnek yapacağım ama öncesinde methodlarını öğrenmekte fayda var.</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="nv">$memcache</span><span class="o">-&gt;</span><span class="nf">get</span><span class="p">(</span><span class="s1">'anahtar'</span><span class="p">)</span> <span class="c1">// anahtar keyine ait olan value yi(değeri) getirir.</span>
    <span class="nv">$memcache</span><span class="o">-&gt;</span><span class="nf">set</span><span class="p">(</span><span class="s1">'anahtar'</span><span class="p">,</span> <span class="s1">'saklayacağımız içerik buraya gelecek'</span><span class="p">,</span> <span class="kc">false</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="c1">// Bir değeri set etmek için kullanılır buraya yazdığımız veriler RAM de saklanır. İlk parametre RAM bellekteki 'key' değeri ikincisi value yani RAM bellekte saklayacağımız içerik, üçüncü parametre sıkıştırma yapılıp yapılmayacağını belirten parametredir. True olursa zlib ile sıkıştırma yapar eğer false ise sıkıştırma yapmaz. Son parametre ise kaç saniye cachleneceğini belirten parametredir. Buradaki süre dolduğu zaman cache silinir.</span>
    <span class="nv">$memcache</span><span class="o">-&gt;</span><span class="nb">flush</span><span class="p">()</span> <span class="c1">// Ram bellekteki tüm depolanan keyleri siler.</span>
    <span class="nv">$memcache</span><span class="o">-&gt;</span><span class="nb">delete</span><span class="p">(</span><span class="s1">'key'</span><span class="p">)</span> <span class="c1">// Belirtilen key'e ait veriyi siler.</span>
    <span class="nv">$memcache</span><span class="o">-&gt;</span><span class="nf">connect</span><span class="p">(</span><span class="s1">'hostname'</span><span class="p">,</span> <span class="mi">11211</span><span class="p">)</span> <span class="c1">// Connect ise örnekte kullandığımız gibi memcached serverına bağlanmamızı sağlar.</span>
</code></pre></div></div>
<p>Memcached default olarak 11211 portunu kullanır o yüzden örneklerde 11211 portu üzerinden gösterdim. Spesifik olarak değiştirilmek istenirse ona göre port numarasını değiştirip projelerinizde kullanabilirsiniz.</p>

<p>Şunu unutmamak gerekiyor RAM üzerinde cacheleyeceğimiz her içerik 1 MB boyutunu geçmemeli eğer geçerse cachelenemez. Verileriniz 1MB üzerinde olduğunu düşünüyorsanız sıkıştırma parametresini TRUE yaparak sıkıştırmayı etkinleştirmeliyiz. Bunun sebebi RAM bellek üzerindeki her bloğun 1024 Kbyte büyüklüğünde olmasından kaynaklanmaktadır.</p>

<p>Şimdi bir de veritabanından veri çeken bir örnek yaparak asıl kullanım amacına uygun birşeyler yapalım.</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="cp">&lt;?php</span>

    <span class="k">try</span> <span class="p">{</span> 
    	<span class="nv">$db</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">PDO</span><span class="p">(</span><span class="s1">'mysql:host=localhost;dbname=dbname;charset=utf8'</span><span class="p">,</span> <span class="s1">'username'</span><span class="p">,</span> <span class="s1">'password'</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nc">PDOException</span> <span class="nv">$e</span><span class="p">)</span> <span class="p">{</span> 
    	<span class="k">echo</span> <span class="nv">$e</span><span class="o">-&gt;</span><span class="nf">getMessage</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="nv">$mem</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Memcache</span><span class="p">;</span>
    <span class="nv">$mem</span><span class="o">-&gt;</span><span class="nf">connect</span><span class="p">(</span><span class="s1">'localhost'</span><span class="p">,</span> <span class="mi">11211</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span> <span class="p">(</span><span class="s2">"Bağlantı Hatası!"</span><span class="p">);</span>

    <span class="nv">$query</span> <span class="o">=</span> <span class="nv">$db</span><span class="o">-&gt;</span><span class="nf">query</span><span class="p">(</span><span class="s1">'SELECT * FROM data WHERE data_id &lt; ?'</span><span class="p">);</span>
    <span class="nv">$query</span><span class="o">-&gt;</span><span class="nf">execute</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s2">"1000"</span><span class="p">));</span>
    <span class="nv">$islem</span>	<span class="o">=</span> <span class="nv">$query</span><span class="o">-&gt;</span><span class="nf">fetchAll</span><span class="p">(</span><span class="no">PDO</span><span class="o">::</span><span class="no">FETCH_ASSOC</span><span class="p">);</span>

    <span class="nv">$array</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>

    <span class="k">foreach</span> <span class="p">(</span><span class="nv">$islem</span> <span class="k">as</span> <span class="nv">$row</span><span class="p">)</span>
    <span class="p">{</span>	
    	<span class="nv">$array</span><span class="p">[</span><span class="s1">'data_name'</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$row</span><span class="p">[</span><span class="s1">'data_name'</span><span class="p">];</span>
    <span class="p">}</span>
    <span class="nv">$data_name</span> <span class="o">=</span> <span class="nv">$mem</span><span class="o">-&gt;</span><span class="nf">get</span><span class="p">(</span><span class="s1">'dataName'</span><span class="p">)</span>
    <span class="k">if</span><span class="p">(</span><span class="nv">$data_name</span> <span class="o">===</span> <span class="kc">true</span><span class="p">){</span>
    	<span class="nb">print_r</span><span class="p">(</span><span class="nv">$data_name</span><span class="p">);</span>
    <span class="p">}</span><span class="k">else</span><span class="p">{</span>
    	<span class="nv">$mem</span><span class="o">-&gt;</span><span class="nf">set</span><span class="p">(</span><span class="s1">'dataName'</span><span class="p">,</span> <span class="nv">$array</span><span class="p">[</span><span class="s1">'data_name'</span><span class="p">],</span> <span class="kc">true</span><span class="p">,</span> <span class="mi">60</span><span class="p">)</span> <span class="k">or</span> <span class="k">die</span><span class="p">(</span><span class="s1">'Memcached üzerinde cacheleme işlemi yapılamadı!'</span><span class="p">);</span>	
    <span class="p">}</span>
    <span class="cp">?&gt;</span>
</code></pre></div></div>
<p>Gibi bir örnekle kullanımını noktalıyorum gerisi sizin hayal gücünüz ve programlama yeteneklerinize kalmış birşeydir.</p>

<p>Memcache üzerinde bulunan get(), set(), flush(), delete(), connect() methodlarını kullanarak özelleştirmek artık sizin kendi işiniz.</p>

<p>Umarım faydalı bir döküman olmuştur. Eğer makale içinde yaptığım hatalar var ise bunları yorum yaparak bana bildirirseniz sevinirim. Kurulumlarda ve kullanımda karşılaştığınız hataları da yazarsanız onlara da çözüm getirmeye çalışırım. Herkese kolay gelsin.</p>

<p><strong>Faydalandığım makaleler:</strong></p>

<ul>
  <li><a href="http://stackoverflow.com/questions/34173231/how-to-install-memcache-on-xampp-windows-7-8-10" title="Install Memcache For Windows">StackOverflow</a></li>
  <li><a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-memcache-on-ubuntu-14-04" title="Install Memcache For Ubuntu">DigitalOcean</a></li>
  <li><a href="http://www.liquidweb.com/kb/how-to-install-memcached-on-centos-6/" title="Install Memcache For Centos">LiquidWeb</a></li>
</ul>]]></content><author><name></name></author><category term="server" /><summary type="html"><![CDATA[Merhaba arkadaşlar, bir önceki yazımda site performansını arttırma ile alakalı bir yazı yazacağımı söylemiştim. Bunun tek bir yazıya sığmayacağını düşündüm ve bir performans serisi yapmaya karar verdim. Bu serinin ilk ayağı olan bu yazımda cachleme sistemlerinden Memcached‘ı anlatmaya çalışacağım.]]></summary></entry><entry><title type="html">SQL’de View ve Stored Procedure Kullanımı</title><link href="https://blog.sgok.dev/sql/2016/05/12/sql-de-view-ve-stored-procedure-kullanimi.html" rel="alternate" type="text/html" title="SQL’de View ve Stored Procedure Kullanımı" /><published>2016-05-12T17:56:16+00:00</published><updated>2016-05-12T17:56:16+00:00</updated><id>https://blog.sgok.dev/sql/2016/05/12/sql-de-view-ve-stored-procedure-kullanimi</id><content type="html" xml:base="https://blog.sgok.dev/sql/2016/05/12/sql-de-view-ve-stored-procedure-kullanimi.html"><![CDATA[<p>Merhaba arkadaşlar bugün anlatacağım konular <code class="language-plaintext highlighter-rouge">Stored Procedure</code>(Saklı Yordamlar) ve <code class="language-plaintext highlighter-rouge">View</code>(Görünümler) olacak. Konuya geçmeden önce temel SQL bilginiz olduğunu varsayıyorum. Bir önceki konuda bahsettiğim gibi(<a href="https://sgok.github.io/sql/2015/12/13/sql-de-trigger-kullanimi.html" title="SQL'de Trigger Kullanımı">SQL’de Trigger Kullanımı</a>) SQL kullanırken onun özelliklerinden tam anlamıyla yararlanmalıyız. SQL işlevlerini kullanırken çok amaçlı işler yapabilirsiniz. Ben temel anlamda(giriş seviyede) konuyu anlatacağım.
<!--more--></p>
<h3 id="view-görünümler">View (Görünümler)</h3>

<p>View’ler nedir önce ondan bahsedeyim. Listeleme işlemlerimizi yaparken bize hız kazandıran ve SQL sunucuyu daha az yoran bir işlevdir. Genellikle <code class="language-plaintext highlighter-rouge">view</code>lerde <code class="language-plaintext highlighter-rouge">SELECT</code> sorgusu kullanılır.</p>

<p>Özetleyecek olursak bizim normalde PHP kodu içersinde kullandığımız SQL sorgularımızı, view denilen fiziksel olarak bulunmayan sanal tablolardan çalıştırırız. Tablolar veritabanında fiziksel olarak bulunurlar ancak viewler sql sorgularından oluşurlar.</p>

<p>Şimdi bunu örneklendirelim ve konuyu daha iyi anlayalım.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">CREATE</span> 
    	<span class="k">VIEW</span> <span class="n">onayliYorum</span> <span class="cm">/* View adı*/</span>
    	<span class="k">AS</span>
    	<span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">yorumlar</span> <span class="k">AS</span> <span class="n">yo</span> <span class="cm">/* Sorgumuz */</span>
    	<span class="k">INNER</span> <span class="k">JOIN</span> <span class="n">konular</span> <span class="k">AS</span> <span class="n">ko</span> <span class="k">ON</span> <span class="n">ko</span><span class="p">.</span><span class="n">konu_id</span> <span class="o">=</span> <span class="n">yo</span><span class="p">.</span><span class="n">yorum_konu_id</span> 
    	<span class="k">WHERE</span> <span class="n">yorum_onay</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</code></pre></div></div>
<p>Şeklinde oluşturulurlar. Bu örneğimizde yorumlar tablomuzdan konulara ait onaylanmış yorumları listelettik. Şimdi bunu PHP tarafında nasıl kullanacağımızı anlatayım.</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="cp">&lt;?php</span>

    	<span class="nv">$mysqli</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">mysqli</span><span class="p">(</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="s2">"root"</span><span class="p">,</span> <span class="s2">"sifre"</span><span class="p">,</span> <span class="s2">"dbadi"</span><span class="p">);</span> <span class="c1">// DB bağlantısını yapıyoruz.</span>

    	<span class="k">if</span><span class="p">(</span> <span class="nv">$yorumListelet</span> <span class="o">=</span> <span class="nv">$mysqli</span><span class="o">-&gt;</span><span class="nf">query</span><span class="p">(</span><span class="s2">"SELECT * FROM onayliYorum"</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span> <span class="c1">// onayliYorum View'ini çağırdık. ve ne yapmak istiyorsak yaptık.</span>
    		<span class="k">foreach</span> <span class="p">(</span> <span class="nv">$yorumListelet</span> <span class="k">as</span> <span class="n">yorumListele</span> <span class="p">)</span> <span class="p">{</span>
    			<span class="nb">print_r</span><span class="p">(</span><span class="nv">$yorumListele</span><span class="p">);</span>		
    		<span class="p">}</span>
    	<span class="p">}</span>
    <span class="cp">?&gt;</span>
</code></pre></div></div>

<p>Viewleri silmek için;</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DROP</span> <span class="k">VIEW</span> <span class="n">onayliYorum</span>
</code></pre></div></div>
<p>Yazmak yeterlidir.</p>

<p>PHP üzerinde kullanımı yukarıda ki şekildedir. Tabi ki bunu genişletip sorgularınızı değiştirebilirsiniz. Basit ve hızlıdır, viewleri projelerinizde rahatlıkla kullanabilirsiniz.</p>

<h3 id="stored-procedure-saklı-yordamlar">Stored Procedure (Saklı Yordamlar)</h3>

<p>SP’ler nedir kısaca bahsetmek gerekirse veritabanında bulunan derlenmiş SQL sorgularıdır diyebilirim. Yani siz SP’leri çağırdığınızda hazır olarak derlenmiş sonuçları alırsınız bu da veritabanı trafiğini oldukça azaltır. SQL sorgularından çok daha hızlı çalışırlar. SP’lerin iyi yazılmış olması çok önemlidir. Performans kaybı yaşamamak için optimize edilmiş SQL kodları kullanılmalıdır. SP’ler aynı zamanda bize veri güvenliği de sağlarlar. Stored Procedure’ye kimlerin erişeceğini belirtebiliriz, böylece güvenliği sağlamış oluruz. Şimdi düşünün büyük bir projeniz var ve sürekli aynı sql sorgularıyla çalışıyorsunuz bir çok yerde aynı sorguyu tek tek yazıyorsunuz. İşte bunun önüne geçmek için bir SP oluşturup tek bir sefer kodu çalıştırmanız hem performans anlamında hemde hızlı kod yazma anlamında size büyük avantaj sağlayacaktır.</p>

<p>O kadar çok teori anlattık ki artık basit şekilde bir SP oluşturalım ve ne olduğunu pratikte görelim.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>
       <span class="k">CREATE</span>
    	<span class="k">PROCEDURE</span> <span class="n">yorumGoster</span><span class="p">()</span>
    	<span class="k">BEGIN</span>
    	   <span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">yorumlar</span> <span class="k">WHERE</span> <span class="n">yorum_onay</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    	<span class="k">END</span><span class="err">$$</span>
    <span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>
<p>View’lerde gördüğümüz örneğe benzer bir şekilde göstermek istedim en azından nasıl çalıştığını anlayabilmeniz açısından.</p>

<p>Şimdi bu SP yi nasıl çalıştırabileceğimize bakalım.</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="cp">&lt;?php</span>

    	<span class="nv">$mysqli</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">mysqli</span><span class="p">(</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="s2">"root"</span><span class="p">,</span> <span class="s2">"sifre"</span><span class="p">,</span> <span class="s2">"dbadi"</span><span class="p">);</span> <span class="c1">// DB bağlantısını yapıyoruz.</span>

    	<span class="k">if</span> <span class="p">(</span> <span class="nv">$yorumGoster</span> <span class="o">=</span> <span class="nv">$mysqli</span><span class="o">-&gt;</span><span class="nf">query</span><span class="p">(</span><span class="s2">"CALL yorumGoster()"</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span> <span class="c1">// SP'yi çağırıyoruz.</span>
    		<span class="k">foreach</span> <span class="p">(</span><span class="nv">$yorumGoster</span> <span class="k">as</span> <span class="nv">$yorumListele</span><span class="p">)</span> <span class="p">{</span> 
    			<span class="nb">print_r</span><span class="p">(</span><span class="nv">$yorumListele</span><span class="p">);</span>	
    		<span class="p">}</span>
    	<span class="p">}</span>
    <span class="cp">?&gt;</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">CALL yorumGoster()</code>Şeklinde çağrılabilir.</p>

<p>Şimdi birde parametreli örnek yapalım.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>
       <span class="k">CREATE</span>
    	<span class="k">PROCEDURE</span> <span class="n">yorumGoster</span><span class="p">(</span><span class="n">sp_onay</span> <span class="nb">INT</span><span class="p">,</span> <span class="n">sp_kimin_yorumu</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">100</span><span class="p">))</span>
    	<span class="k">BEGIN</span>
    	   <span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">yorumlar</span> <span class="k">WHERE</span> <span class="n">yorum_onay</span> <span class="o">=</span> <span class="n">sp_onay</span> <span class="k">AND</span> <span class="n">yorum_yapan</span> <span class="o">=</span> <span class="n">sp_kimin_yorumu</span><span class="p">;</span>
    	<span class="k">END</span><span class="err">$$</span>
    <span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>
<p>Yukarıda parametreli bir SP oluşturduk. Burada sp_onay değişkeninin integer değer alacağını belirttim ve sp_kimin_yorumu adlı değişkende ise varchar veri türü olabileceğini belirttim. Şimdi bunu nasıl çağıracacağız onu göstereyim.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">CALL</span> <span class="n">yorumGoster</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s1">'w133'</span><span class="p">)</span>
</code></pre></div></div>
<p>Şeklinde parametre verilerek çalıştırılır. Birinci değerimiz integer olduğu için değeri sayısal şekilde gönderdik ve ikincil değişkenimiz varchar olduğu için onu string şeklinde gönderdik. Biraz daha karmaşık örneklere geçelim.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>
       <span class="k">CREATE</span>
    	<span class="k">CREATE</span> <span class="k">DEFINER</span><span class="o">=</span> <span class="n">w133</span><span class="o">@</span><span class="n">localhost</span> <span class="cm">/* SP yi sadece w133 kullanıcısı kullanabilir diye tanımlıyorum */</span>
    	<span class="k">PROCEDURE</span> <span class="n">yorumEkle</span><span class="p">(</span><span class="n">sp_yorum_ekleyen</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">100</span><span class="p">),</span> <span class="n">sp_yorum_eposta</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">100</span><span class="p">),</span> <span class="n">sp_yorum_icerik</span> <span class="nb">TEXT</span><span class="p">,</span> <span class="n">sp_yorum_tarih</span> <span class="nb">DATETIME</span><span class="p">)</span>
    	<span class="k">BEGIN</span>
    	   <span class="k">INSERT</span> <span class="k">INTO</span> <span class="n">yorumlar</span> 
    	   <span class="k">SET</span> <span class="n">yorum_yapan</span> <span class="o">=</span> <span class="n">sp_yorum_ekleyen</span><span class="p">,</span> 
    	   <span class="n">yorum_email</span> <span class="o">=</span> <span class="n">sp_yorum_eposta</span><span class="p">,</span> 
    	   <span class="n">yorum_icerik</span> <span class="o">=</span> <span class="n">sp_yorum_icerik</span><span class="p">,</span> 
    	   <span class="n">yorum_tarih</span> <span class="o">=</span> <span class="n">sp_yorum_tarih</span><span class="p">;</span>
    	<span class="k">END</span><span class="err">$$</span>
    <span class="k">DELIMITER</span> <span class="p">;</span>	
</code></pre></div></div>
<p>Kullanımına gelecek olursak yine benzer şekilde parametreli kullanılır.</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="cp">&lt;?php</span>

    	<span class="nv">$mysqli</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">mysqli</span><span class="p">(</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="s2">"root"</span><span class="p">,</span> <span class="s2">"sifre"</span><span class="p">,</span> <span class="s2">"dbadi"</span><span class="p">);</span> <span class="c1">// DB bağlantısını yapıyoruz.</span>
    	<span class="nv">$yorum_ekleyen</span> <span class="o">=</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s2">"yorum_ekleyen"</span><span class="p">];</span>
    	<span class="nv">$yorum_email</span> <span class="o">=</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s2">"yorum_email"</span><span class="p">];</span>
    	<span class="nv">$yorum_icerik</span> <span class="o">=</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s2">"yorum_icerik"</span><span class="p">];</span>
    	<span class="nv">$yorum_tarih</span> <span class="o">=</span> <span class="nb">date</span><span class="p">(</span><span class="s2">"Y-m-d H:m:s"</span><span class="p">);</span>

    	<span class="k">if</span> <span class="p">(</span> <span class="nv">$yorumEkleme</span> <span class="o">=</span> <span class="nv">$mysqli</span><span class="o">-&gt;</span><span class="nf">query</span><span class="p">(</span><span class="s2">"CALL yorumEkle('"</span><span class="mf">.</span><span class="nv">$yorum_ekleyen</span><span class="mf">.</span><span class="s2">"', '"</span><span class="mf">.</span><span class="nv">$yorum_email</span><span class="mf">.</span><span class="s2">"', '"</span><span class="mf">.</span><span class="nv">$yorum_icerik</span><span class="mf">.</span><span class="s2">"', "</span><span class="mf">.</span><span class="nv">$yorum_tarih</span><span class="mf">.</span><span class="s2">")"</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span> <span class="c1">// SP'yi çağırıyoruz.</span>
    		<span class="k">echo</span> <span class="s2">"Yorum başarıyle eklendi"</span><span class="p">;</span>
    		<span class="p">}</span>
    	<span class="p">}</span>
    <span class="cp">?&gt;</span>
</code></pre></div></div>
<p>Ben anlaşılması açısından ve örnek olması için basit bir örnek verdim. Geliştirmek yine size kalmış.</p>

<p>Yine farklı bir örnek verelim.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>
       <span class="k">CREATE</span>
    	<span class="k">PROCEDURE</span> <span class="n">konuGetir</span><span class="p">(</span><span class="k">IN</span> <span class="n">p_konu_id</span> <span class="nb">INT</span><span class="p">,</span> <span class="k">OUT</span> <span class="n">f_name</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">45</span><span class="p">))</span>
    	<span class="k">BEGIN</span>
    	   <span class="k">SELECT</span> <span class="n">konu_adi</span> <span class="k">INTO</span> <span class="n">f_name</span> <span class="k">FROM</span> <span class="n">konular</span> <span class="k">WHERE</span> <span class="n">konu_id</span> <span class="o">=</span> <span class="n">p_konu_id</span><span class="p">;</span>
    	<span class="k">END</span><span class="err">$$</span>
    <span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>
<p>Önceki örneklerde tekli parametre görmüştük şimdi bu örnekte in/out lu parametreler alıyor. “Yahu bu da neyin nesi?” demeden önce size açıklayayım. IN ile daha önceki örneklerde gördüğümüz giriş parametresinin tipini belirtmiş oluyoruz. OUT ile bir çıkış değişkeni oluşturuyoruz aslında. Daha iyi anlamak için bu SP’yi çağıralım.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">CALL</span> <span class="n">konuGetir</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="o">@</span><span class="n">kullanici</span><span class="p">);</span>
</code></pre></div></div>
<p>Out ile @kullanici değişkenine aktardığımız sorguyu artık sadece;</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">SELECT</span> <span class="o">@</span><span class="n">kullanici</span>
</code></pre></div></div>
<p>Diye çağırarak 3 numaralı konuyu çağırabiliriz.</p>

<h3 id="if-else-kullanımı">IF Else Kullanımı</h3>

<p>Stored Procedureler aslında fonksiyon oldukları için T-SQL komutları da rahatlıkla kullanılıp programlanabilirler. Şimdi IF ve ELSE şart cümleciklerini kullanarak bir örnek yapalım</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>

    <span class="k">CREATE</span> <span class="k">PROCEDURE</span> <span class="n">MusteriSeviyesi</span><span class="p">(</span>
        <span class="k">in</span>  <span class="n">p_musteriNumarasi</span> <span class="nb">int</span><span class="p">(</span><span class="mi">11</span><span class="p">),</span> 
        <span class="k">out</span> <span class="n">p_musteriSeviyesi</span>  <span class="nb">varchar</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
    <span class="k">BEGIN</span>
        <span class="k">DECLARE</span> <span class="n">kredilim</span> <span class="nb">double</span><span class="p">;</span> <span class="cm">/* kredilim diye bir değişken tanımladık */</span>

        <span class="k">SELECT</span> <span class="n">kredilimiti</span> <span class="k">INTO</span> <span class="n">kredilim</span>
        <span class="k">FROM</span> <span class="n">musteriler</span>
        <span class="k">WHERE</span> <span class="n">musteriNumarasi</span> <span class="o">=</span> <span class="n">p_musteriNumarasi</span><span class="p">;</span>

        <span class="n">IF</span> <span class="n">kredilim</span> <span class="o">&gt;</span> <span class="mi">100</span> <span class="k">THEN</span> <span class="cm">/* Kredi 100 den Büyükse */</span>
            <span class="k">SET</span> <span class="n">p_musteriSeviyesi</span> <span class="o">=</span> <span class="s1">'ALTIN'</span><span class="p">;</span> <span class="cm">/* Müşteri ALTIN üye olsun.*/</span>
        <span class="n">ELSEIF</span> <span class="n">kredilim</span> <span class="o">&lt;=</span> <span class="mi">100</span>  <span class="k">THEN</span>
            <span class="k">SET</span> <span class="n">p_musteriSeviyesi</span> <span class="o">=</span> <span class="s1">'GUMUS'</span><span class="p">;</span>
        <span class="n">ELSEIF</span> <span class="n">kredilim</span> <span class="o">&lt;</span> <span class="mi">50</span> <span class="k">THEN</span>
            <span class="k">SET</span> <span class="n">p_musteriSeviyesi</span> <span class="o">=</span> <span class="s1">'BRONZ'</span><span class="p">;</span>
        <span class="k">END</span> <span class="n">IF</span><span class="p">;</span>

    <span class="k">END</span><span class="err">$$</span>

    <span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>
<h3 id="when-case-kullanımı">When Case Kullanımı</h3>

<p>WHEN CASE koşulunuda Procedurlerimizde kullanabiliriz örneğin</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>

    <span class="k">CREATE</span> <span class="k">PROCEDURE</span> <span class="n">MusteriSeviyesi</span><span class="p">(</span>
     <span class="k">in</span>  <span class="n">p_musteriNumarasi</span> <span class="nb">int</span><span class="p">(</span><span class="mi">11</span><span class="p">),</span> 
     <span class="k">out</span> <span class="n">p_MusteriSeviyesi</span>  <span class="nb">varchar</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
    <span class="k">BEGIN</span>
        <span class="k">DECLARE</span> <span class="n">kredilim</span> <span class="nb">double</span><span class="p">;</span>

        <span class="k">SELECT</span> <span class="n">kredilimiti</span> <span class="k">INTO</span> <span class="n">kredilim</span>
     <span class="k">FROM</span> <span class="n">musteriler</span>
     <span class="k">WHERE</span> <span class="n">musteriNumarasi</span> <span class="o">=</span> <span class="n">p_musteriNumarasi</span><span class="p">;</span>

        <span class="k">CASE</span>  
     <span class="k">WHEN</span> <span class="n">kredilim</span> <span class="o">&gt;</span> <span class="mi">100</span> <span class="k">THEN</span> 
        <span class="k">SET</span> <span class="n">p_musteriSeviyesi</span> <span class="o">=</span> <span class="s1">'ALTIN'</span><span class="p">;</span>
     <span class="k">WHEN</span> <span class="n">kredilim</span> <span class="o">&lt;=</span> <span class="mi">100</span> <span class="k">THEN</span>
        <span class="k">SET</span> <span class="n">p_musteriSeviyesi</span> <span class="o">=</span> <span class="s1">'GUMUS'</span><span class="p">;</span>
     <span class="k">WHEN</span> <span class="n">kredilim</span> <span class="o">&lt;</span> <span class="mi">50</span> <span class="k">THEN</span>
        <span class="k">SET</span> <span class="n">p_musteriSeviyesi</span> <span class="o">=</span> <span class="s1">'BRONZ'</span><span class="p">;</span>
     <span class="k">END</span> <span class="k">CASE</span><span class="p">;</span>

    <span class="k">END</span><span class="err">$$</span>

    <span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>
<p>IF ve ELSE kullanımına benzer bir şekilde WHEN CASE koşullarını da SP’lerde rahatlıkla kullanabiliriz. İyi güzel bunları yaptıkta şimdi nasıl çağıracağız diye düşünebilirsiniz. Şimdi nasıl çağrıldığına bakalım.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">CALL</span> <span class="n">MusteriSeviyesi</span><span class="p">(</span><span class="mi">112</span><span class="p">,</span><span class="o">@</span><span class="n">seviye</span><span class="p">);</span> <span class="cm">/* 112 numaralı müşteri */</span>
    <span class="k">SELECT</span> <span class="o">@</span><span class="n">seviye</span> <span class="k">AS</span> <span class="s1">'Musteri Seviyesi'</span><span class="p">;</span> <span class="cm">/* Artık Musteri Seviyesi takma adımızla rahatlıkla tabloyu izleyebileceğiz. */</span>
</code></pre></div></div>
<h3 id="while-döngüsü-kullanımı">While Döngüsü Kullanımı</h3>

<p>Aslında programlama dillerinde neler yapılabiliyorsa hemen hemen benzeri şeyler SP içinde de yapılıyor döngüler bile! İsterseniz basit bir döngü yazalım.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>
     <span class="k">DROP</span> <span class="k">PROCEDURE</span> <span class="n">IF</span> <span class="k">EXISTS</span> <span class="n">donguWhile</span><span class="err">$$</span>
        <span class="k">CREATE</span> <span class="k">PROCEDURE</span> <span class="n">donguWhile</span><span class="p">(</span><span class="k">IN</span> <span class="n">baslangic</span> <span class="nb">INT</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="k">IN</span> <span class="n">bitis</span> <span class="nb">INT</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
        <span class="k">BEGIN</span>
         <span class="k">DECLARE</span> <span class="n">isim</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
         <span class="k">SET</span> <span class="n">isim</span> <span class="o">=</span> <span class="s1">''</span><span class="p">;</span>
         <span class="n">WHILE</span> <span class="n">baslangic</span> <span class="o">&lt;</span> <span class="n">bitis</span> <span class="k">DO</span>
          <span class="k">SET</span> <span class="n">isim</span> <span class="o">=</span> <span class="n">concat</span><span class="p">(</span><span class="n">isim</span><span class="p">,</span> <span class="n">baslangic</span><span class="p">,</span> <span class="s1">','</span><span class="p">);</span>
          <span class="k">SET</span> <span class="n">baslangic</span> <span class="o">=</span> <span class="n">baslangic</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
         <span class="k">END</span> <span class="n">WHILE</span><span class="p">;</span>
        <span class="k">END</span><span class="err">$$</span>
    <span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>
<p>Şeklinde While döngüsü kullanılabilir.</p>

<p>Şimdi biraz daha farklı bir konu olan Stored Functions örneği yapalım.</p>

<h3 id="stored-functions">Stored Functions</h3>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>
       <span class="k">CREATE</span>
    	<span class="k">FUNCTION</span> <span class="n">cemberAlaniHesapla</span><span class="p">(</span><span class="n">sayi</span> <span class="nb">INT</span><span class="p">)</span>
    	<span class="k">RETURNS</span> <span class="nb">FLOAT</span>
    	<span class="k">BEGIN</span>
    	   <span class="k">RETURN</span> <span class="n">PI</span><span class="p">()</span> <span class="o">*</span> <span class="n">sayi</span> <span class="o">*</span> <span class="n">sayi</span><span class="p">;</span>
    	<span class="k">END</span><span class="err">$$</span>
    <span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>
<p>Şeklinde tanımlanır kullanımı ise;</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">SELECT</span> <span class="n">cemberAlaniHesapla</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
</code></pre></div></div>
<p>Görüldüğü üzere çember alanını bulan bir Stored Functions tanımladık.</p>

<p>Daha çok çeşitli örnekler yapılabilir. Umarım View’ler, Stored Procedure ve Stored Functions konularını anlatabilmişimdir.</p>]]></content><author><name></name></author><category term="sql" /><summary type="html"><![CDATA[Merhaba arkadaşlar bugün anlatacağım konular Stored Procedure(Saklı Yordamlar) ve View(Görünümler) olacak. Konuya geçmeden önce temel SQL bilginiz olduğunu varsayıyorum. Bir önceki konuda bahsettiğim gibi(SQL’de Trigger Kullanımı) SQL kullanırken onun özelliklerinden tam anlamıyla yararlanmalıyız. SQL işlevlerini kullanırken çok amaçlı işler yapabilirsiniz. Ben temel anlamda(giriş seviyede) konuyu anlatacağım.]]></summary></entry><entry><title type="html">SQL’de Trigger Kullanımı</title><link href="https://blog.sgok.dev/sql/2015/12/13/sql-de-trigger-kullanimi.html" rel="alternate" type="text/html" title="SQL’de Trigger Kullanımı" /><published>2015-12-13T17:22:16+00:00</published><updated>2015-12-13T17:22:16+00:00</updated><id>https://blog.sgok.dev/sql/2015/12/13/sql-de-trigger-kullanimi</id><content type="html" xml:base="https://blog.sgok.dev/sql/2015/12/13/sql-de-trigger-kullanimi.html"><![CDATA[<p>Merhaba arkadaşlar bugün sizlere <code class="language-plaintext highlighter-rouge">SQL</code> de nasıl trigger kullanılır bunları anlatacağım. Konuya geçmeden önce temel SQL bilginiz olduğunu varsayarak konuyu anlatacağım.</p>

<p>Yaptığımız projelerde zaman zaman veritabanıyla alakalı ihtiyaç duyduğumuz işlevler oluyor. Bu işlevlerden bana göre ihtiyaç duyulan bir işlev olan <code class="language-plaintext highlighter-rouge">trigger</code>e geçmeden önce triggerin ne olduğunu öğrenelim.</p>

<!--more-->

<h3 id="trigger-nedir">Trigger Nedir?</h3>

<p>Trigger kelimesi Türkçe de <code class="language-plaintext highlighter-rouge">tetiklemek</code> ya da <code class="language-plaintext highlighter-rouge">tetikleyici</code> anlamına gelmektedir. “Peki ya ne işe yarar bu tetikleyici neyi tetikler?” dediğinizi duyar gibiyim. Örnek verecek olursak bir tablomuz var ve bu tablomuzda yaptığımız işlemler başka bir tabloda da bir etki yaratsın istiyorsak trigger kullanmalıyız.</p>

<p>“Ne diyorsun sen be adam!” demeden önce bir daha düşünün lütfen :). Daha da açıklayacak olursak <strong>kategoriler</strong> adında bir tablomuz olsun. Bu tablonun içinden örneğin PHP kategorisini sileceğiz. PHP kategorisini sildiğimiz zaman istiyoruz ki bu kategoriye ait konular da silinsin. Tek tek elle bütün konular tablosunu aramayalım istiyoruz. İşte burada yardımımıza trigger koşuyor ve süper kahraman edasıyla bu işi ben çözerim diyor.</p>

<h3 id="nasıl-yapılır">Nasıl Yapılır?</h3>

<p>Yukarıda verdiğim örnekten gidelim bir adet kategoriler tablomuz ve bir de konular tablomuz olsun. PHP kategorisini sileceğiz ve o kategoriye ait olan tüm konuları sileceğiz. Bu kadar teori yeter artık biraz pratiğe geçip kod yazalım.</p>

<p>Şimdi kendi veritabanı yöneticimizi açalım phpMyadmin veya hangisini kullanıyorsanız SQL kodu yazma bölümüne gelip aşağıdaki kodları yazalım</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>

    <span class="k">CREATE</span>
    	<span class="k">DEFINER</span> <span class="o">=</span> <span class="n">root</span><span class="o">@</span><span class="n">localhost</span> <span class="cm">/* Tanımlayıcı */</span>
    	<span class="k">TRIGGER</span> <span class="n">konulari_sil</span> <span class="cm">/* Trigger adı */</span>
    	<span class="k">AFTER</span> <span class="k">DELETE</span> <span class="cm">/* Trigger Zamanı (AFTER) Trigger Olayı (DELETE) */</span>
    	<span class="k">ON</span> <span class="n">kategoriler</span> <span class="cm">/* kategoriler tablomu seçtim */</span>
    	<span class="k">FOR</span> <span class="k">EACH</span> <span class="k">ROW</span> <span class="cm">/* Buradan sonra trigger tanımlamamıza geçebiliriz */</span>
    	<span class="k">BEGIN</span>
    	<span class="k">DELETE</span> <span class="k">FROM</span> <span class="n">konular</span> <span class="k">WHERE</span> <span class="n">konu_kategori_id</span> <span class="o">=</span> <span class="k">OLD</span><span class="p">.</span><span class="n">kategori_id</span><span class="p">;</span> <span class="cm">/* konular tablomda, konu_kategori_id  eşitse kategoriler tablomda son silinen kategori_id ye işlemi yap. */</span>
    	<span class="k">END</span><span class="err">$$</span>

    <span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>

<p>Yukarıda gördüğünüz üzere <code class="language-plaintext highlighter-rouge">konulari_sil</code> adında bir trigger adı verdik. Sonrasında <code class="language-plaintext highlighter-rouge">AFTER DELETE</code> diyerek silme işlemi gerçekleştikten sonra yap dedik. Daha sonra <code class="language-plaintext highlighter-rouge">kategoriler</code> tablomuzu seçtik. <code class="language-plaintext highlighter-rouge">BEGIN</code> ve <code class="language-plaintext highlighter-rouge">END$$</code> belirteçlerimiz arasına yapılacak işlemi tanımlıyoruz. <code class="language-plaintext highlighter-rouge">konu_kategori_id</code> eşitse <code class="language-plaintext highlighter-rouge">OLD.kategori_id</code> ye yani son silinen kategorinin id’sine eşitse konular tablosundaki konu_kategori_id bu işlemi gerçekleştir ve konuyu sil diyoruz.</p>

<p>Yukarıda ki trigger tanımlamamızı yaptıktan sonra (tabi siz kendi tablo ve sütunlarınıza göre isimlerini değiştirebilirsiniz.) artık kategori sildiğimiz zaman otomatik olarak o kategoriye ait konumuzun silinmesi tetiklenmiş olacak ve bizi büyük bir külfetten kurtaracak.</p>

<p>Bu işlemi siz kendi projenize veya veritabanınıza göre şekillendirip farklılaştırabilirsiniz, ben örnek olması açısından böyle bir örnek gösterdim. Tabi ki triggerlerin işlevi sadece <code class="language-plaintext highlighter-rouge">DELETE</code> işlemiyle bitmiyor <code class="language-plaintext highlighter-rouge">INSERT, UPDATE</code> gibi işlemlerde yapılıyor. Bu işlemlere <code class="language-plaintext highlighter-rouge">BEFORE, AFTER</code> gibi zamanlar verip gerçekleşecek olan işlemin önce mi yoksa sonra mı olacağına karar verebiliyoruz.</p>

<h3 id="farklı-örnekler">Farklı Örnekler</h3>

<p>Farklı bir örnek olması açısından başka bir işlem gerçekleştirelim. Örneğin <code class="language-plaintext highlighter-rouge">malidurum</code> adında bir tablomuz var ve bu tabloda güncelleme yapıldığında otomatik olarak <code class="language-plaintext highlighter-rouge">kayitlar</code> tabloma yansısın istiyorum ki yapılan değişiklikleri kayitlar tablosunda izleyebilelim.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">DELIMITER</span> <span class="err">$$</span>

    <span class="k">CREATE</span>
    	<span class="k">DEFINER</span> <span class="o">=</span> <span class="n">root</span><span class="o">@</span><span class="n">localhost</span> <span class="cm">/* Tanımlayıcı */</span>
    	<span class="k">TRIGGER</span> <span class="n">tetikleyici_adi</span> <span class="cm">/* Trigger adı */</span>
    	<span class="k">BEFORE</span> <span class="k">UPDATE</span> <span class="cm">/* Trigger Zamanı (BEFORE) Trigger Olayı (UPDATE) */</span>
    	<span class="k">ON</span> <span class="n">malidurum</span> <span class="cm">/* malidurum tablomu seçtim */</span>
    	<span class="k">FOR</span> <span class="k">EACH</span> <span class="k">ROW</span> <span class="cm">/* Buradan sonra trigger tanımlamamıza geçebiliriz */</span>
    	<span class="k">BEGIN</span>
    	<span class="k">INSERT</span> <span class="k">INTO</span> <span class="n">kayitlar</span> <span class="k">SET</span> <span class="n">kayit_cari</span> <span class="o">=</span> <span class="k">OLD</span><span class="p">.</span><span class="n">cari_durum</span><span class="p">,</span> <span class="n">guncelleme_tarihi</span> <span class="o">=</span> <span class="k">OLD</span><span class="p">.</span><span class="n">cari_tarih</span><span class="p">;</span> <span class="cm">/* kayitlar tabloma yapılan değişikliği eklettiriyorum. */</span>
    	<span class="k">END</span><span class="err">$$</span>

    <span class="k">DELIMITER</span> <span class="p">;</span>
</code></pre></div></div>

<p>Yukarıda ki örnekte malidurum tablosunda bir güncelleme yapılırsa bu UPDATE işleminden önce yapılan değişiklikleri kayıtlar adlı tabloya ekle dedim ve değerlerini bildirdim.</p>

<p>Trigger konusunda elbette daha farklı yapılan işlevler vardır ancak ben en çok işe yarayabilecek konuları anlatmak istedim. En azından temel olarak tetikleyiciler ne işe yarar öğrenmiş olduk.</p>]]></content><author><name></name></author><category term="sql" /><summary type="html"><![CDATA[Merhaba arkadaşlar bugün sizlere SQL de nasıl trigger kullanılır bunları anlatacağım. Konuya geçmeden önce temel SQL bilginiz olduğunu varsayarak konuyu anlatacağım. Yaptığımız projelerde zaman zaman veritabanıyla alakalı ihtiyaç duyduğumuz işlevler oluyor. Bu işlevlerden bana göre ihtiyaç duyulan bir işlev olan triggere geçmeden önce triggerin ne olduğunu öğrenelim.]]></summary></entry></feed>