명령문이 실행되기 전에 mysqli_stmt :: send_long_data를 호출해야합니다. execute ()을 호출 한 후 send_long_data를 사용하려고하면 오류가 발생합니다. 일반적인 오류 메시지는 다음과 같습니다.
경고 : mysqli_stmt :: send_long_data ()는 매개 변수 1이 자원, null이 될 것으로 기대합니다.
이 오류는 send_long_data가 호출 될 때 SQL 문에 대한 핸들이 제대로 준비되지 않았기 때문입니다.
솔루션 <br> SQL 문을 실행하기 전에 Send_long_data를 사용하여 긴 데이터를 전달하십시오. 올바른 순서는 다음과 같습니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO large_data (content) VALUES (?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">send_long_data</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$largeData</span></span><span>); </span><span><span class="hljs-comment">// 빅 데이터를 보내십시오</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>(); </span><span><span class="hljs-comment">// 실행 진술</span></span><span>
</span></span>
문제 설명
send_long_data는 매개 변수의 인덱스를 올바르게 지정해야합니다. 예를 들어, SQL 문에 여러 자리 표시자가있는 경우 올바른 매개 변수 인덱스를 전달해야합니다.
경고 : mysqli_stmt :: send_long_data ()는 매개 변수 1이 자원, null이 될 것으로 기대합니다.
이 오류는 일반적으로 올바른 색인이 지정되지 않은 경우에 발생하므로 PHP가 데이터를 올바르게 찾지 못합니다.
솔루션 <br> 인덱스가 Send_long_data 에 올바르게 지정되어 있는지 확인하십시오. 인덱스는 일반적으로 0에서 시작하여 SQL 문의 첫 번째 자리 표시자를 나타냅니다. 예를 들어:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO large_data (content) VALUES (?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">send_long_data</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$largeData</span></span><span>); </span><span><span class="hljs-comment">// 첫 번째 자리 표시자를 위해 긴 데이터를 올바르게 전달하십시오</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
문제 설명
mysqli_stmt :: send_long_data는 빅 데이터를 처리하는 데 사용되지만 데이터가 MySQL 구성에서 최대 데이터 크기 세트를 초과하면 전송 실패가 발생합니다. 이것은 일반적으로 오류 메시지로 나타납니다.
MySQL 오류 : 칼럼에 너무 긴 데이터.
이 오류는 일반적으로 단일 보내기의 최대 패킷 크기를 제어하는 MySQL 구성 파일의 옵션 인 Max_allowed_packet 매개 변수와 관련이 있습니다.
솔루션 <br> 이 문제를 해결하려면 먼저 MySQL 구성 파일에서 max_allowed_packet 매개 변수를 확인하고 조정해야합니다. 다음 명령을 통해 현재 구성을 볼 수 있습니다.
<span><span><span class="hljs-keyword">SHOW</span></span><span> VARIABLES </span><span><span class="hljs-keyword">LIKE</span></span><span> </span><span><span class="hljs-string">'max_allowed_packet'</span></span><span>;
</span></span>
현재 값이 작 으면이 매개 변수의 값을 my.cnf 또는 my.ini 파일에 추가하고 MySQL 서비스를 다시 시작할 수 있습니다.
<span><span><span class="hljs-attr">max_allowed_packet</span></span><span> = </span><span><span class="hljs-number">64</span></span><span>M
</span></span>
문제 설명
Send_long_data가 긴 데이터를 보내는 데 사용되면 전달 된 데이터 유형이 SQL 문의 자리 표시 자 유형과 일치하도록해야합니다. 예를 들어, 자리 표시 자 유형이 Blob 인 경우 전달 된 데이터는 이진 데이터 여야합니다.
데이터 유형이 일치하지 않으면 오류가 발생할 수 있습니다.
경고 : mysqli_stmt :: send_long_data ()는 매개 변수 2가 문자열, 자원이 될 것으로 기대합니다.
솔루션 <br> 전달 된 데이터 유형이 SQL 문의 자리 표시 자 유형과 일치하는지 확인하십시오. 자리 표시 자 유형이 문자열 인 경우 데이터는 문자열이어야합니다. 이진 데이터 ( b ) 인 경우 데이터는 이진 형식이어야합니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO large_data (file_content) VALUES (?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"b"</span></span><span>, </span><span><span class="hljs-variable">$binaryData</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">send_long_data</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$binaryData</span></span><span>); </span><span><span class="hljs-comment">// 이진 데이터를 보냅니다</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
문제 설명
Send_Long_Data는 활성 데이터베이스 연결을 유지해야하므로 연결이 시간이 지남에 따라 또는 실행 중에 닫히면 오류가 발생합니다. 오류 메시지는 다음과 같습니다.
오류 : 쿼리 중에 MySQL 서버에 대한 연결이 손실되었습니다.
이 문제는 일반적으로 데이터베이스가 오랫동안 작동하지 않거나 많은 양의 데이터가 업로드되면 연결이 중단 될 때 발생합니다.
솔루션 <br> 연결 시간 초과를 피하려면 작동 중에 데이터베이스 연결이 활성 상태인지 확인하십시오. 데이터 전송 시간이 길면 PHP의 max_execution_time 또는 mySQL의 Wait_Timeout을 조정하여 시간 초과를 피할 수 있습니다.
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'max_execution_time'</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>); </span><span><span class="hljs-comment">// PHP 최대 실행 시간 5 분</span></span><span>
</span></span>
동시에, 한 번에 너무 많은 데이터를 보내지 않고 연결 손실을 일으키기 위해 많은 양의 데이터를 보낼 때 배치로 처리를 고려할 수도 있습니다.
질문 설명 <br> SQL 문을 실행할 때 모든 매개 변수가 올바르게 바인딩되어야합니다. 파라미터를 바인딩 할 때 오류가 발생하면 Send_long_data가 제대로 작동하지 않을 수 있습니다. 예를 들어, Bind_Param 바인딩 매개 변수를 사용하지만 데이터가 성공적으로 전달되지 않으면 문제가 발생합니다.
솔루션 <br> SQL 문을 실행하기 전에 Bind_Param을 사용하여 필요한 모든 매개 변수를 올바르게 바인딩하고 반환 값을 확인하여 바인딩이 성공했는지 확인하십시오.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO large_data (content) VALUES (?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">send_long_data</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$largeData</span></span><span>); </span><span><span class="hljs-comment">// 바인딩 매개 변수 후에 긴 데이터를 보내야합니다</span></span><span>
}
</span></span>